求最值窮舉
重疊子問題→暴力窮舉效率低下
最優子結構→通過子問題最值得到原問題最值
狀態轉移方程→正確的窮舉
明確【狀態】 -> 定義dp陣列/函式的意義 -> 明確【選擇】-> 明確base case
fibnacci數列
// 遞迴
intfib
(int n)
//備忘錄解法, 自頂向下
intfib
(int n)
inthelper
(vector<
int>
& memo,
int n)
// 動態規劃, 自底向上
intfib
(int n)
return dp[n];}
// o(1)複雜度,只儲存前兩個狀態
intfib
(int n)
return cur;
}
湊零錢問題
// 暴力遞迴(如何窮舉)
intcoinchange
(vector<
int>
& coins,
int n)
return mini;
}// 備忘錄
intcoinchange
(vector<
int>
& coins,
int n)
inthelper
(vector<
int>
& coins,
int n)
return memo[n];}
// 動態規劃(如何聰明的窮舉)
intcoinchange
(vector<
int>
& coins,
int n)
}return dp[n]
;}
資料結構與演算法學習筆記 動態規劃的入門與程式設計實現
本文的內容部分引自 我們遇到的問題中,有很大一部分可以用動態規劃 簡稱dp 來解。解決這類問題可以很大地提公升你的能力與技巧,我會試著幫助你理解如何使用dp來解題。這篇文章是基於例項展開來講的,因為乾巴巴的理論實在不好理解。動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解將由上...
演算法與資料結構 動態規劃
動態規劃 dp 的基本思想是 當前子問題的解可由上一子問題的解得出。動態規劃演算法通常基於由乙個遞推公式 狀態轉移方程 和若干個初始狀態 狀態 應用 1 lis longest increasing subsequence 求乙個陣列中的最長非降子串行的長度。子問題 我們可以考慮先求a 0 a 1 ...
演算法與資料結構 動態規劃
用遞迴求解問題時,反覆的巢狀會浪費記憶體。而且更重要的一點是,之前計算的結果無法有效儲存,下一次碰到同乙個問題時還需要再計算一次。例如遞迴求解 fibonacci 數列,假設求第 n 位 從 1 開始 的值,c 如下 include intfib int n return fib n 1 fib n...