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個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的...
動態規劃及其動態規劃經典例題
動態規劃是最重要 最經典的演算法之一,學好動態規劃對我們十分重要,掌握動態規劃對解決某些問題會起到事半功倍的效果。特點 可以把原始問題劃分為一系列子問題 求解每個子問題僅一次,並將其結果儲存到乙個表中,以後用到時直接訪問,不重複計算,節省時間。自底向上地計算 適用範圍 原問題可以分為多個相關子問題,...