1. 程式人生 > 其它 >【演算法】經典排序

【演算法】經典排序

一、動態規劃五部曲

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天不持有股票手上的現金