動態規劃經典5題

2021-07-16 03:37:25 字數 2807 閱讀 4739

dp一年多沒碰過了,今天突然想找找感覺,找了經典的幾道dp複習著敲了敲。雖然最大子矩陣,滑雪,石子合併等問題也足夠經典,我還是從中找了5道最經典的dp寫了這篇博文,如果您是大一,大二想踏入程式競賽的同學可以當習題做做,如果您像我一樣不是acmer,平時專案中也很少用dp,同樣可以回顧一下dp的奧妙。

給定k個整數的序列,其任意連續子串行可表示為,其中 1 <= i <= j <= k。最大連續子串行是所有連續子序中元素和最大的乙個, 例如給定序列,其最大連續子串行為,最大和為20。

狀態轉移方程: sum[i]=max(sum[i-1]+a[i],a[i])

**清單:

數塔問題 :要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?

轉移方程:sum[i] = max(a[左孩子] , a[右孩子]) + a[i]

[cpp]view plain

copy

#include 「stdio.h」

#define n 5

main(),  

,  ,  

,    

};  

for(i = n-1; i > 0; i–)  

for(j = 0; 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]。求解將哪些物品裝入揹包可使價值總和最大。

轉移方程:dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]] + value[i]

[cpp]view plain

copy

#include 「stdio.h」

#define max(a,b) ((a)>(b)?(a):(b))

main();       

int weight = ;     

int i,j;      

int dp[n+1][v+1];  

for(i = 0; i 

for(j = 0; j 

dp[i][j] = 0;  

for(i = 1; i <= n; i++)  

}  printf(」%d」,dp[n][v]);  

}  

給定乙個序列 an = a1 ,a2 ,  … , an ,找出最長的子串行使得對所有 i 

轉移方程:b[k]=max(max(b[j]|a[j]

**清單:

[cpp]view plain

copy

#include 「stdio.h」

main();  

int *b;  

b = (int *)malloc(sizeof(a));  

length = sizeof(a)/sizeof(a[0]);  

for(i = 0; i 

}  }  

for(i = 0; i 

if(b[i] > max)  

max = b[i];  

printf(」%d」,max);  

}  

乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。

轉移方程:

dp[i,j] = 0                                          i=0 || j=0

dp[i,j] = dp[i-1][j-1]+1                        i>0,j>0, a[i] = b[j]       

dp[i,j] = max(dp[i-1][j],dp[i][j-1])        i>0,j>0, a[i] != b[j]

[cpp]view plain

copy

#include 「stdio.h」

#define m 8

#define n 6

void printlsc(int i, int j,char *a, int status[n])else  

}  main();  

char b = ;  

int status[m][n]; //儲存狀態

int dp[m][n];  

for(i = 0; i 

for(j = 0; j 

for(i = 1; i 

for(j = 1; 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」);  

}  

動態規劃經典五題

雖然最大子矩陣,滑雪,石子合併等問題也足夠經典,我還是從中找了5道最經典的dp寫了這篇博文。有n 件物品和乙個容量為 v的揹包。第 i件物品的費用是 c i 價值是 w i 求解將哪些物品裝入揹包可使價值總和最大。轉移方程 dp i j max dp i 1 j dp i 1 j weight i ...

複製書稿(動態規劃經典題)

problem description 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的...

動態規劃及其動態規劃經典例題

動態規劃是最重要 最經典的演算法之一,學好動態規劃對我們十分重要,掌握動態規劃對解決某些問題會起到事半功倍的效果。特點 可以把原始問題劃分為一系列子問題 求解每個子問題僅一次,並將其結果儲存到乙個表中,以後用到時直接訪問,不重複計算,節省時間。自底向上地計算 適用範圍 原問題可以分為多個相關子問題,...