把位置(i,j)看成乙個狀態,然後定義狀態(i,j)的指標函式d(i,j):從位置(i,j)出發時能得到的最大和。
int i,j;
//邊界值處理
for(j=1;j<=n;j++)
result[n][j] = data[n][j];
//由下向上動態規劃,儲存葉子節點到當前節點的最大值
for(i=n-1; i>=1;i--)
for(j = 1; j<=i; j++)
result[i][j] =data[i][j]+max(result[i+1][j],result[i+1][j+1])
memset(result,-1,sizeof(result))
int solve(int i, int j)
//判斷result[i][j] >= 0,判斷該節點是否已經被計算過
if(result[i][j] >= 0)
return result[i][j];
return result[i][j] = data[i][j] + (i==n?0:max(solve(i+1,j),solve(i+1,j+1)));
}硬幣問題:
有n種硬幣,面值分別為v1, v2, v3,……,vn,每種面值的硬幣有無限個,使得面值之和恰好為s,輸出硬幣數目的最大值和最小值。——固定終點的最長路和最短路
有向無環圖為dag ( directed acyclic graph)
萬能的模板:
動態規劃學習
首先是01揹包問題,可以把它看做是乙個 行和列分別是體積從1,2,v,每個物品的花費c1,c2,cn,每個空格裡的數代表放入第i個物品在體積為j的揹包裡的最大價值。dp j 表示體積為j的揹包,放入物品後,可以得到的最大值。狀態轉移方程為if j c i dp j max dp j dp j c i...
動態規劃學習二
西洋棋中的車可以水平的或豎直的移動,乙個車要從乙個棋盤的一角移到對角線的另一角,有多少種最短路徑?a,用動態規劃演算法求解 b,用初等排列組合知識求解 題目參考 b方法高中就知道了,最後結果c 2n n 程式設計方法可以參照動態規劃學習一 這裡主要介紹第一種方法 想要得到 a n n 反推,由於不能...
動態規劃學習總結
1.有時候階段劃分不正確,導致不是最優解。2.邊界條件找錯,或資料開的小,導致超時或wrong answer等。3.初始化出錯,不是所有的初始化都是為0,有的是其他的,eg memset a,127,sizeof a 這要根據題目具體分析。4.揹包問題有時半天推不出是什麼型別的揹包問題。5.揹包問題...