動態規劃的解題步驟
定義狀態(其實也就是描述最優子結構)
描述不同狀態如何轉移(一般可以求出乙個狀態轉移方程)
按乙個方向(一般都是自底而上)求出該問題的解
以01揹包問題為例:
定義狀態
定義狀態dp[i][j]為前i件物品恰放入容量為j的揹包時的最大價值;那麼dp[n][v]就是這個問題的最終解;
描述不同狀態如何轉移:
在這個過程中,我們很自然想到的決策就是第i件物品放還是不放;放與不放會直接影響到dp[i][j]的值;
a.放,那麼dp[i][j]的狀態可由dp[i-1][j-ci] + wi轉移過來
b.不放,那麼dp[i][j]的狀態可由dp[i-1][j]轉移過來
我們所要做的就是在這兩種決策中選取一種最優的;
所以狀態轉移方程為dp[i][j] =max(dp[i-1][j-ci] + wi , dp[i-1][j]);
按乙個方向求出該問題的解
狀態dp[i][j]總是要取決於之前的狀態dp[i-1][j-ci] +wi,dp[i-1][j],所以我們應按按自底而上的方向求解
**如下:
#include
#include
#include
using
namespace std;
const
int inf =
2005
;int dp[inf]
[inf]
;//定義狀態dp[i][j]為前i件物品放入容量為j的揹包時的最大價值;
int w[inf]
,c[inf]
;int
main()
for(
int i =
1; i <= n; i++
)memset
(dp,0,
sizeof
(dp));
//初始化
for(
int i =
1; i <= n; i++
)//自底而上的求解
else}}
printf
("%d\n"
,dp[n]
[v])
;return0;
}
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...