經典DP問題

2021-06-23 03:29:04 字數 2297 閱讀 4630

動態規劃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問題的最優子結構和無後效性外,還應該符合在區間上操作的特點。我的理解是往往會對區間進行合併操作。抑或是單個元素 可看成乙個小區間 跨區間進行操作。例如括號匹配問題,石子合併問題 通過多次的相鄰合併,最後實質上會產生跨區間的合併,如果你把...