我想學習動態規劃(DP)的基礎知識,並通過一些網上資源,我能得到,比如去......什麼是動態規劃的新手解釋?
- What is dynamic programming?
- Good examples, articles, books for understanding dynamic programming
- Tutorial for Dynamic Programming
- Dynamic Programming – From Novice to Advanced - (我不能正確理解它(即如何使用DP來解決問題))
並且直到n嗷嗷我得到理解
一個動態的問題是幾乎相同的是的 遞歸只需差異(這給它,它是知道 爲電源)
即存儲價值或解決方案,並再次使用它來尋找下一個解決方案
例如:
據codechef
問題的說明:最小的步驟的一個
問題陳述:在一個正整數,則可以執行以下3個步驟的任何一個。
- 從它減去1。 (N = N - 1)
- 如果其被2整除,除以2(如果n%2 == 0,則n = N/2)
- 如果其被3整除,除以3(如果n%3 == 0,則n = N/3)
現在的問題是,給定一個正整數n,找到的步驟的最小數目取n設置爲1
例如:
- 對於n = 1,輸出:0
- 對於n = 4,輸出:2(4/2 = 2/2 = 1)
對於n = 7,輸出:3(7 -1 = 6/3 = 2/2 = 1)
int memo [n + 1]; //我們將初始化元素爲-1(-1表示,不解決它尚未)
自上而下的方法對上述問題
int getMinSteps (int n) {
if (n == 1) return 0;
if(memo[n] != -1) return memo[n];
int r = 1 + getMinSteps(n - 1);
if(n%2 == 0) r = min(r , 1 + getMinSteps(n/2));
if(n%3 == 0) r = min(r , 1 + getMinSteps(n/3));
memo[n] = r ; // save the result. If you forget this step, then its same as plain recursion.
return r;
}
我在瞭解DP糾正,或者任何人都可以用更好更簡單的方式解釋它,這樣我就可以學習它,並且可以用動態編程解決問題。