德魯週記10--15天從0開始刷動態規劃(leetcode動態規劃題目型別總結)

安德魯JANKENPAN發表於2020-12-20

什麼是動態規劃

這裡我們引用維建百科的描述:“動態規劃在查詢有很多重疊子問題的情況的最優解時有效。它將問題重新組合成子問題,為了避免多次解決這些子問題,它們的結果都是逐漸被計算並被儲存,從簡單的問題直到整個問題都被解決。因此,動態規劃儲存遞迴的結果,因而不會在解決同樣的問題上花費時間。動態規劃只能應用於有最優子結構的問題。最優子結構的意思是區域性最優解能決定全域性最優解(對有些問題這個要求並不能完全滿足,故有時需要引入一定的近似)。簡單來說,問題能夠分解成子問題來解決。”

題目型別

我們從題目入手,從簡到難,一步一步學會如何處理動態規劃問題。
我用親身經歷告訴你們,刷完這些題,對解決動態規劃問題不會再覺得困難。
(我一共花了15天刷完以下題目,我建議不要高於21天完成以下練習)

基本一維動態規劃

題目編號:

  1. 70.爬樓梯.
  2. 53.最大子序和.
  3. 198.打家劫舍.
  4. 213.打家劫舍2.
  5. 413.等差數列劃分.

這五道題都是比較基礎的動態規劃入門題目,通過這三道題能夠了解動態規劃的整個流程,首先應該是確定狀態方程即dp[i]=fun(dp[i-x],dp[i-y]); 先確定當前狀態所依賴的之前狀態的演算法。這是整個動態規劃的核心問題(有時涉及一些變化的技巧),也是最難的問題。然後便是建立一維陣列,然後迴圈遍歷,將之前迴圈的結果記錄下來。當然在瞭解了這三道題之後,你可能會發現不用有些題可以進行空間的壓縮,並不一定需要一個完整的一維陣列,這也是慢慢練習掌握的技巧。

基本二維動態規劃

題目編號:

  1. 64.最小路徑和.
  2. 542.01矩陣.
  3. 221.最大正方形.

這三道題都是比較基礎的二維動態規劃入門題目,學習了一維動態規劃,我們來看看二維動態規劃,二維的動態規劃更可能是動態規劃一種常見的形式,他的轉移方程可能要依賴於上一個狀態和當前狀態的前幾次結果,狀態轉移方程的構建稍微有一些不同,我的建議是你先找一個樣例畫一個二維陣列,試著模擬一下,如何根據之前的狀態推出當前狀態,再寫出狀態方程。當然在我和同學交流的過程中,也發現有人覺得直接寫狀態方程更直觀和容易理解,這取決於自己的思維習慣,所以大家要通過不斷的練習來訓練。另外類似於一維動態規劃,二維動態規劃也可以對空間進行壓縮,壓縮為一維的陣列,這點大家可以自己感受。

分割類問題

題目編號:

  1. 279.完全平方數.
  2. 91.解碼方法.
  3. 139.單詞拆分.
  4. 343.整數拆分.

接下來就進入到具體型別的動態規劃問題,通過不同問題的總類我們分別學習不同的解題方法。首先是分割類問題,對於分割類問題,動態規劃的狀態轉移方程通常並不依賴相鄰的位置,而是依賴於滿足分割條件的位置。通過這四道題目大家應該能有所感受。

子序列問題

題目編號:

  1. 300.最長遞增子序列.
  2. 646.最長數對鏈.
  3. 583.兩個字串的刪除操作.
  4. 1143.最長公共子序列.
  5. 376.擺動序列.

子序列問題一般都是兩個字串或陣列進行比較,找出相同或者變化的子序列問題,這類問題也是非常經典的動態規劃問題。對於子序列問題,第一種動態規劃方法是,定義一個dp陣列,其中dp[i]表示以i結尾的子序列的性質。在處理好每個位置後,統計一遍各個位置的結果即可得到題目要求的結果。第二種動態規劃方法是,定義一個dp陣列,其中dp[i]表示到位置i為止的子序列的性質,並不必須以i結尾。這樣dp陣列的最後一位結果即為題目所求,不需要再對每個位置進行統計。

揹包問題

題目編號:

  1. 416.分割等和子集.
  2. 474.一和零.
  3. 322.零錢兌換.
  4. 494.目標和.

揹包問題是一種組合優化的NP問題。有N個物品和容量為W的揹包,每個物品都有自己的體積W和價值V,求拿那些物品可以使得揹包所裝下的總價值最大。如果限定每種物品只能選擇0個或者1個,則為0-1揹包問題如果不限定每種物品的數量,則問題稱為無界揹包或者完全揹包問題。揹包問題有時候是抽像的,即求陣列中的一部分數能否相加得到目標數。揹包問題是比較複雜的,這一部分和後面的股票問題的具體解法我專業記錄一下吧。

字串編輯問題

題目編號:

  1. 72.編輯距離.
  2. 650.只有兩個健的鍵盤.
  3. 10.正規表示式匹配.

字串編輯問題是比較難的一種動態規劃問題,但是也有一定技巧,這類題往往會定義一種或幾種操作方式,你要做的是看透這種操作方式所對應的轉移方程,當前位置來源於那幾幾種之前的狀態。

股票問題

題目編號:

  1. 121.買賣股票的最佳時機.
  2. 188.買賣股票的最佳時機IV.
  3. 309.最佳買賣股票時機含冷凍期.
  4. 714.買賣股票的最佳時機含手續費.

股票交易類問題通常可以用動態規劃來解決,對於比較複雜的問題比如含冷凍期或者含手續費的問題主要依靠狀態機來解決。即當前持有股票的狀態來源於前一天的哪幾種狀態,當前不持有股票的狀態來源於前一天哪幾種狀態,通過狀態機來找到狀態轉移方程。具體的分析也有專門寫一遍文章來記錄一下。

相關文章