【算法】動態規划


動態規划

1.概念

動態規划常用於的一個問題就是求最值, 比如說最常見的求最長遞增子序列啊等待。

其實動態規划的問題核心仍然是窮舉,想一下求最值,那最可能的就是把所有結果列出來,誰最大要誰。

動態規划大部分是自底向上的,所以也就脫離了遞歸,更多的是采用for循環的迭代;

動態規划的典型類型:
背包問題;
打家劫舍;
股票問題;
子序列問題;

動態規划常常用於求解多階段決策問題
動態規划問題的問法:只問最優解(常和最值聯系在一起),不問具體的解;

2.過程

動態規划類的題目我們一般情況下按照這三部曲進行:

  • 1.確定dp數組及其下標含義;
  • 2.確定遞推公式,即狀態轉移方程;
  • 3.dp初始化,base case;

一般按照這三步后能夠寫出來一個程序,為了保險起見,我們可以帶一個例子進去檢驗。

最關鍵的就是確定好dp的含義后去尋找遞推關系;

3.樣例

509. 斐波那契數

70. 爬樓梯

746. 使用最小花費爬樓梯

121. 買賣股票的最佳時機

64. 最小路徑和

198. 打家劫舍

213. 打家劫舍 II

5. 最長回文子串

120. 三角形最小路徑和

322. 零錢兌換

4.體會

  • 涉及到多決策的,之前想到的可能是用回溯,去構建一顆決策樹;回溯更多情況下是一種平等的,比如說選1,2,3這樣依次換着選一遍的情況時,我們會去用回溯,在做出一種選擇后將其撤銷進行另一個選擇。但是在不是平等的時候,我們很多情況下會去用動態規划,這和回溯的最大不同在於這里有一個很明確的遞推關系,也就是狀態轉移,比如打家劫舍問題,或者是買賣股票等,dp數組在i時的狀態能夠由之前的遞推出來
  • 很重要的一個點就是我們最初要明確好dp數組是干什么的,下標還有它本身的意義是什么。
  • 要找到base case ,也就是把dp數組初始化好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM