📄️ 6.1 算法解釋
這裡我們引用一下維基百科的描述:「動態規劃(Dynamic Programming, DP)在尋找有許多重疊子問題情況的最優解時非常有效。它將問題重新分解成子問題。為了避免多次解決這些子問題,它們的結果會逐步被計算並保存, 從簡單的問題開始,直到整個問題被解決。因此,動態規劃保存遞迴中的結果,從而避免在解決相同問題時浪費時間⋯⋯ 動態規劃只能應用於有最優子結構的問題。最優子結構的意思是,局部最優解能夠決定全局最優解(對某些問題來說這個要求不完全滿足,因此有時需要引入一定的近似)。簡單來說,問題能夠分解成子問題來解決。」
📄️ 6.2 基本動態規劃:一維
70. Climbing Stairs
📄️ 6.3 基本動態規劃:二維
64. Minimum Path Sum
📄️ 6.4 分割類型題
279. Perfect Squares
📄️ 6.5 子序列問題
300. Longest Increasing Subsequence
📄️ 6.6 背包問題
背包問題(knapsack problem) 是一種組合優化的 NP 完全問題:有 n 個物品和載重為 w 的背包,每個物品都有自己的重量 weight 和價值 value,求拿哪些物品可以使得背包所裝下物品的總價值最大。如果限定每種物品只能選擇 0 個或 1 個,則問題稱為 0-1 背包問題(0-1 knapsack);如果不限定每種物品的數量,則問題稱為 無界背包問題或完全背包問題(unbounded knapsack)。
📄️ 6.7 字符串編輯
72. Edit Distance
📄️ 6.8 股票交易
股票交易類問題通常可以用動態規劃來解決。對於稍微複雜一些的股票交易類問題,比如需要冷卻時間或者交易費用,則可以通過動態規劃實現的狀態機來解決。
📄️ 6.9 練習
基礎難度