講了動態規劃:
一道題如何判斷用動態規劃來解,并且如何解,一共有以下幾個要素:
動態規劃一般可以回答以下三個問題:
a) 最優解/Maximum/Minimum
b) Yes/No
c) Count(*) 2. ?方程 Function
然后在構造動態規劃的解答的時候,主要分為下面四個步驟
- 狀態 State
靈感,創造?力,存儲?小規模問題的結果 - 狀態之間的聯系,怎么通過?小的狀態,來求得?大的狀態
- 初始化 Intialization:最極限的?小狀態是什么, 起點
- 答案 Answer: 最?大的那個狀態是什么,終點
以上是基礎算法班的知識,這節課主要講的是記憶化滾動數組優化和記憶化搜索。
滾動數組優化主要是如果遞推公式里,i的值只和有限個前值相關,就可以優化,比如i只和i-1,i-2相關,那么只要開一個長度為2的數組循環利用就可以了。
記憶化搜索的主要用處是1. 當DP的i不是只和前面的值有關的情況,比如說有可能是矩陣類型的搜索需要搜索四個方向,2.game的問題,兩個玩家你拿一個我拿一個這種用記憶化搜索比較容易一些
題目:
1. Longest Increasing Continuous Subsequence: 因為是連續的,所以后一個值只和前一個值有關系,所以可以用滾動數組優化
2. Maximum Subarray: 利用前綴和數組
3. Maximal Square: 利用以某一個坐標為右下角的點,看看能不能形成正方形,并且記錄其邊長
4. Longest Palindromic Substring: 這題我從來都沒用動態規劃來解決過,直接loop
5. Coins in a Line: 記憶化搜索中的game問題,只考慮當前自己能夠獲得的值
6. Coins in a Line II: 同上題
7. House Robber : 可以用滾動數組來優化
8. Maximum Product Subarray: 除了記錄當前最小值和當前最大值,關鍵是要把自己這個點加進去考慮
9. Longest Increasing Subsequence:這題的i和前面0~i-1個值都相關,所以沒法用滾動數組來優化了
10. Longest Increasing Continuous subsequence II: 這題叫做滑雪道問題,就是從最高處一直朝下滑。一道很好的記憶化搜索+backtracking的問題??梢栽僮鲆槐?/strong>