動態規劃5個經典問題解析:
給定k個整數的序列,其任意連續子串行可表示為,其中 1 <= i <= j <= k。最大連續子串行是所有連續子序中元素和最大的乙個, 例如給定序列,其最大連續子串行為,最大和為20。
數塔問題 :要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?
#include "stdio.h"
#define n 5
main(),
, ,
, };
for(i = n-1; i > 0; i--)
for(j = 0; j < i; j++)
data[i-1][j] += data[i][j] > data[i][j+1] ? data[i][j] : data[i][j+1];
printf("%d",data[0][0]);
}
有
n件物品和乙個容量為
v的揹包。第
i件物品的費用是
c[i]
,價值是
w[i]
。求解將哪些物品裝入揹包可使價值總和最大。
#include "stdio.h"
#define max(a,b) ((a)>(b)?(a):(b))
void main();
int weight = ;
int i,j;
int dp[n+1][v+1];
for(i = 0; i < n+1; i++)
for(j = 0; j < v+1; j++)
dp[i][j] = 0;
for(i = 1; i <= n; i++)
} printf("%d",dp[n][v]);
}
給定乙個序列
an=
a1 ,a2 , ... , an
,找出最長的子串行使得對所有
i ai
#include "stdio.h"
#include "stdlib.h"
void main();
int *b;
b = (int *)malloc(sizeof(a));
length = sizeof(a)/sizeof(a[0]);
for(i = 0; i < length; i++)
} }
for(i = 0; i < length; i++)
if(b[i] > max)
max = b[i];
printf("%d",max);
}
乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
#include "stdio.h"
#define m 8
#define n 6
void printlsc(int i, int j,char *a, int status[n])else
} void main();
char b = ;
int status[m][n]; //儲存狀態
int dp[m][n];
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
for(i = 1; i < m; i++)
for(j = 1; j < n; j++)
else if(dp[i][j-1] >= dp[i-1][j])
else
} printf("最大長度:%d",dp[m-1][n-1]);
printf("\n");
printlsc(m-1,n-1,a,status);
printf("\n");
}
郵局 dp經典問題
題目 題意 一些村莊被建立在一條筆直的高速公路邊上,我們用一條座標軸來描述這條高速公路,每乙個村莊的座標都是整數,沒 有兩個村莊座標相同。兩個村莊間的距離,定義為它們的座標值差的絕對值。我們需要在一些村莊建立郵局 當然,並不是每 乙個村莊都必須建立郵局,郵局必須被建立在村莊裡,因此它的座標和它所在的...
DP經典問題 WordBreak
這個題解法很多,順便理一下思路 dp幾步走 1.寫狀態轉移方程,根據方程就可以得到基本dp方法,注意時間複雜度和空間複雜度的計算。2.很多dp劃分方式很多,所以注意使用記憶搜尋來優化dp的處理速度。3.事實上使用dp遞迴呼叫仍然使用了大量的儲存空間,使用dp自底向上可以實現o 1 儲存的實現,但往往...
區間dp(經典問題)
所謂區間dp,顧名思義就是在一段區間上的動態規劃。它既要滿足dp問題的最優子結構和無後效性外,還應該符合在區間上操作的特點。我的理解是往往會對區間進行合併操作。抑或是單個元素 可看成乙個小區間 跨區間進行操作。例如括號匹配問題,石子合併問題 通過多次的相鄰合併,最後實質上會產生跨區間的合併,如果你把...