動態規劃入門

2021-10-08 18:26:24 字數 2510 閱讀 3739

基礎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 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...