動態規划
1.概念
動態規划常用於的一個問題就是求最值, 比如說最常見的求最長遞增子序列啊等待。
其實動態規划的問題核心仍然是窮舉,想一下求最值,那最可能的就是把所有結果列出來,誰最大要誰。
動態規划大部分是自底向上的,所以也就脫離了遞歸,更多的是采用for循環的迭代;
動態規划的典型類型:
背包問題;
打家劫舍;
股票問題;
子序列問題;
動態規划常常用於求解多階段決策問題
動態規划問題的問法:只問最優解(常和最值聯系在一起),不問具體的解;
2.過程
動態規划類的題目我們一般情況下按照這三部曲進行:
- 1.確定dp數組及其下標含義;
- 2.確定遞推公式,即狀態轉移方程;
- 3.dp初始化,base case;
一般按照這三步后能夠寫出來一個程序,為了保險起見,我們可以帶一個例子進去檢驗。
最關鍵的就是確定好dp的含義后去尋找遞推關系;
3.樣例
4.體會
- 涉及到多決策的,之前想到的可能是用回溯,去構建一顆決策樹;回溯更多情況下是一種平等的,比如說選1,2,3這樣依次換着選一遍的情況時,我們會去用回溯,在做出一種選擇后將其撤銷進行另一個選擇。但是在不是平等的時候,我們很多情況下會去用動態規划,這和回溯的最大不同在於這里有一個很明確的遞推關系,也就是狀態轉移,比如打家劫舍問題,或者是買賣股票等,dp數組在i時的狀態能夠由之前的遞推出來;
- 很重要的一個點就是我們最初要明確好dp數組是干什么的,下標還有它本身的意義是什么。
- 要找到base case ,也就是把dp數組初始化好。