1.定義子問題:
什麼可以算得上有子問題,可以用動態規劃解決的問題呢?例如在打家劫舍的演算法題中,問題可以被拆分為各個子問題,子問題是打劫前k家能得到的最大金額。假設一共有 n 個房子的話,就一共有 n個子問題。動態規劃實際上就是通過求這一堆子問題的解,來求出原問題的解。這要求子問題需要具備兩個性質:
(1)原問題要能由子問題表示。例如這道小偷問題中,k=n 時實際上就是原問題。否則,解了半天子問題還是解不出原問題,那子問題豈不是白解了。
(2)乙個子問題的解要能通過其他子問題的解求出。例如這道小偷問題中,f(k)可以由 f(k-1)和 f(k-2) 求出。這個性質就是教科書中所說的「最優子結構」。如果定義不出這樣的子問題,那麼這道題實際上沒法用動態規劃解。
2.寫子問題的遞推關係:
子問題之間存在一種遞推關係。第k個子問題的結果是由第k-1或者k-2個子問題的結果得出的。
3.確定dp陣列的計算順序:
dp 陣列也可以叫」子問題陣列」,因為 dp 陣列中的每乙個元素都對應乙個子問題。dp[k] 對應子問題 f(k),即偷前 k 間房子的最大金額。
4.空間優化
案例:(leetcode198)
**:
class
solution
if(len ==1)
max[0]
= nums[0]
;for
(int i=
1;i)return max[len-1]
;}}
動態規劃解題步驟
動態規劃解題步驟?給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse...
動態規劃解題思路
在leetcode上看題解與結合自己的想法得出思路。首先明確 dp 陣列所存資料的含義。這步很重要,如果不得當或者不夠清晰,會阻礙之後的步驟。然後根據 dp 陣列的定義,假設 dp 0 i 1 dp 0 i 1 都已知,想辦法求出 dp i dp i 一旦這一步完成,整個題目基本就解決了。但如果無法...
動態規劃解題思路
一直以來,對動態規劃的理解處於乙個模糊的狀態,就是一種似乎懂但遇到問題未必能行的狀態 然後,最近重點在leetcode上找了一些動態規劃的題目做了一下,逐漸有了一些思路。我覺得leetcode上對動態規劃思想的概括非常到位,所以記錄在這裡 動態規劃 英語 dynamic programming,簡稱...