基礎dp都是經典例題,非常直觀,易於理解。
hdu 2069.
可以組個列舉各個面值的硬幣的個數,判斷每種情況是否合法。
列舉量是s/50s/25s/10s/5s/1次會超時
定義乙個dp[i][j]陣列建立乙個轉移矩陣
其中,橫向是金額,縱向是硬幣數
矩陣dp[i][j]的含義是用j個硬幣實現金額i的方案數量。
例如dp[6][2]=1,表示用兩個硬幣湊出6分錢,只有一種方案,即5分+1分
「狀態轉移」的特徵是用矩陣前面的狀態dp[i][j]能推算出後面狀態的值。
第一步:只用1分硬幣實現
初始化:dp[0][0]=2,其他為0,定義int type [5]=;為5種硬幣的面值。
從dp[0][0]開始,可以推到後面的狀態。例如dp[1][1]是dp[0][0]進行「金額+1、硬幣數量+1」後的狀態轉移。轉移後組合方案數量不變。即dp[1][1]=dp[0][0]=1;
還要考慮dp[1][1]原有的方案數,遞推關係式則為:
dp[1][1]=dp[1][1]+dp[0][0]=dp[1][1]+dp[1-1][1-1]=0+1=1;
即dp[1][1]=dp[1][1]+dp[1-type[0]][1-1];
再加上剩餘硬幣,繼續進行組合
得出狀態轉移方程為
dp[i][j]=dp[i][j]+dp[i-typep[k]][j-1],k=2,3,4;
總結上述過程,每個狀態dp[i][j]都可以根據它前面已經算出的狀態進行推導,
總複雜度為o(kmn),k是不同面值硬幣的個數,m和n是矩陣的大小。
#include
#include
#include
#include
#include
#include
using
namespace std;
int dp[
251]
[101]=
;//第i個硬幣有j的錢的方案
int coin[5]
=;//不同的金幣數
void
solve()
}int
main()
;solve()
;for
(int i =
0; i <
251; i++)}
while
(cin >> s)
return0;
}
洛谷 p2871 [usaco07dec]charm bracelet s .
與上一題思路基本相同
這一題引進乙個滾動陣列(二維陣列記憶體占用大),從每乙個物品開始,對第i個物品判斷放與不放:放第i件物品之後的總價值與放之前的總價值進行比較;
#include
#include
#include
#include
#include
#include
using
namespace std;
#define max(a,b) a > b ? a : b
int dp[
12881]=
;int v[
3403]=
;int w[
3403]=
;int
main()
for(
int i =
1; i <= n; i++)}
/*for (int i = 0; i < m; i++) */
cout << dp[m]
;return0;
}
hdu 1159.
先確定乙個序列裡面的乙個元素,與另乙個序列裡面所有元素進行比較是否相同,如果相同就在原先基礎上+1,即
dp[i][j]=dp[i-1][j-1]+1;
否則dp[i][j]為之前序列的最大值,即
dp[i][j]=max(dp[i][j-1], dp[i-1][j] )
#include
#include
#include
#include
#include
#include
using
namespace std;
#define max(a,b) a > b ? a : b
#define min(a,b) a > b ? b : a
int dp[
1005][
1005]=
;string str1, str2;
intmain()
else}}
cout << dp[str1.
size()
][str2.
size()
]<< endl;
}return0;
}
動態規劃入門
1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...
動態規劃入門
大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....
動態規劃入門
學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...