動態規劃要記錄子問題的解,避免下次遇到相同的子問題時的重複計算
在計算斐波那契數列時,我們採用遞迴的寫法:
int f(int n)
這時候會涉及很多重複計算,如當n==5
時,計算f(5) = f(4) + f(3)
,在接下來計算f(4) = f(3) + f(2)
時,有重複計算了f(3)
。
為了避免重複計算,引入dp陣列
,用來儲存已經計算過的結果,當dp[n]=-1
表示f(n)還沒有被計算
int dp[maxn] = ;
int f(int n)
}
通過記錄計算過的內容,在下次使用是便不需要重複計算,這就是記憶化搜尋動態規劃的適用於乙個問題必須有重疊子問題對於數塔問題,如果開乙個二維陣列f,其中f[i][j]
存放第i層的第j個數字,那麼有f[1][1]=5
,
f[2][1] = 8
,f[2][2] = 3
...,求最後將路徑上所有數字相加後得到的和最大是多少
如果每次從頭遍歷,那會有很多重複的訪問,通過動態規劃,列出狀態轉移方程
#include#includeusing namespace std;
const int maxn = 1000;
int f[maxn][maxn], dp[maxn][maxn];
int main()
}// 邊界
for(int j = 1; j <= n; j++)
// 從n-1層不斷往上計算出dp[i][j]
for(int i = n - 1; i >= 1; i--)
}printf("%d\n", dp[1][1]); // dp[1][1]為所要答案
// 邊界
點選點選
點選
write by gqq
演算法筆記 動態規劃1
動態規劃適合求解最優問題,比如最大值最小值等。它可以顯著的降低時間複雜度,提高 的執行效率。0 1 揹包問題 在上篇總結中,用回溯演算法解決了 0 1揹包問題。但是,在求解的過程中,我們應該能想象的出,有些步驟是一直在重複執行。如果揹包的總載重為 9 物品個數為 5 質量分別為 2,2,4,6,3 ...
演算法筆記 動態規劃 1
求解方法 標準的01揹包問題是指,有n int型 個物品和最多裝重量w int型 的揹包。weight陣列表示物品的重量,即weight i 表示第i個物品的重量 value陣列表示物品的價值,即value i 表示第i個物品的價值。問把哪些物品裝入揹包使得物品價值總和最大,每個物品只能裝一次。舉例...
演算法筆記 動態規劃 遞推寫法
什麼是動態規劃 動態規劃是一種用來解決一類最優化問題的演算法思想。簡單來說,動態規劃將乙個複雜的問題分解成若干個子問題,通過綜合子問題的最優解來得到原問題打的最優解。需要注意的是,動態規劃會將每個求解過的子問題的解記錄下來,這樣當下一次碰到同樣的子問題時,就可以直接使用之前記錄的結果,而不是重複計算...