【演算法】經典排序
一、動態規劃五部曲
1.確定dp(dp table)陣列的含義
2.確定d[i]陣列初始化值
3.確定遞推公式
求max、求min、求和【裝滿揹包有多少中方法】
4.確定遍歷順序
揹包問題:
(1)考慮先迴圈物品還是先迴圈揹包。
組合問題是先迴圈物品,排列問題是先迴圈揹包[揹包容量的每一個值,都是經過 1 和 5 的計算,包含了{1, 5} 和 {5, 1}兩種情況]
(2)考慮dp陣列是從前向後遍歷,還是從後向前遍歷
如果元素可以用無窮次的話就是前向後遍歷【完全揹包問題】,如果只能用一次的話就是從後向前【01揹包問題】
5.舉例推導dp陣列
二、動態規劃debug
推導dp陣列
三、刷題
1.最長公共重複陣列【要求連續的】與最長公共子序列【不要求連續】
遞推表示式不太明白d[i][j]只考慮nums1[i-1]和nums2[j-1]相同不 相同,不考慮nums1[i-2]與nums2[j-1]
2.最長遞增子序列【不要求連續】與最長連續遞增子序列【要求連續】
結果是對dp狀態求最大
3.【leetcode115】不同子序列
給定一個字串 s 和一個字串 t ,計算在 s 的子序列中 t 出現的個數。
dp陣列含義不懂、遞推表示式不懂、初始化值不懂
(1)dp[i][j]表示以i-1結尾的字串s出現以j-1結尾的字串t的個數
(2)d[0][0]=1:空字元出現空字串的個數
i=0,d[0][j]=0
d[i][0]=1
(3)一般考慮s[i-1]與t[j-1]相等不相等
如果相等 d[i][j]=d[i-1][j-1]+d[i-1][j](用s[i-1]與不用s[i-1]如bagg與bag)
如果不等d[i][j]=d[i-1][j]
4.【leetcode】兩個字串的刪除
5.【leetcode139】單詞拆分
同dp陣列含義不清楚
6.【leetcode121】買賣股票
買賣一次、買賣多次、買賣兩次、買賣k次、多次買賣有冷凍期、買賣有手續費
dp陣列的定義很巧。最開始手上現金為0,dp[i][0]表示第i天持有股票的最多現金,dp[i][1]表示第i天不持有股票手上的現金