leetcode刷題 動態規劃

2022-05-16 22:57:41 字數 3117 閱讀 5546

動態規劃(英語:dynamic programming,簡稱 dp)是一種在數學、管理科學、電腦科學、經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。

動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。

動態規劃背後的基本思想非常簡單。大致上,若要解乙個給定問題,我們需要解其不同部分(即子問題),再根據子問題的解以得出原問題的解。動態規劃往往用於優化遞迴問題,例如斐波那契數列,如果運用遞迴的方式來求解會重複計算很多相同的子問題,利用動態規劃的思想可以減少計算量。

通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,具有天然剪枝的功能,從而減少計算量:一旦某個給定子問題的解已經算出,則將其記憶化儲存,以便下次需要同乙個子問題解之時直接查表。這種做法在重複子問題的數目關於輸入的規模呈指數增長時特別有用。

(1)題目要求

假設把某**的**按照時間先後順序儲存在陣列中,請問買賣該**一次可能獲得的最大利潤是多少?

示例 1:

輸入: [7,1,5,3,6,4]

輸出: 5

解釋: 在第 2 天(**** = 1)的時候**,在第 5 天(**** = 6)的時候賣出,最大利潤 = 6-1 = 5 。

注意利潤不能是 7-1 = 6, 因為賣出**需要大於****。

示例 2:

輸入: [7,6,4,3,1]

輸出: 0

解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

(2)解題思路

思路1:迴圈列表長度,取該子節點後的列表中的最大值裝進minprice容器中,若有大於0的值就返回minprice容器中的最大值。需要注意的是若開始輸入的就是空列表的情況

class

solution(object):

defmaxprofit(self, prices):

""":type prices: list[int]

:rtype: int

"""minprice=

for i in range(len(prices)-1):

begin =prices[i]

after =prices[i+1::]

if len(minprice)>0 and max(minprice)>0:

return

max(minprice)

else

:

return

0

(1)題目要求

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。

相鄰的結點 在這裡指的是下標與上一層結點下標相同或者等於上一層結點下標 + 1 的兩個結點。

例如,給定三角形:

[[2],

[3,4],

[6,5,7],

[4,1,8,3]

]自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。

(2)思路

最小路徑和,和dijsta演算法或者a*、d*演算法相似,如果只考慮當前路徑到下一路徑的最小值,顯然不合理。

動態規劃(英語:dynamic programming,簡稱 dp)是一種在數學、管理科學、電腦科學、經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。

動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。

動態規劃背後的基本思想非常簡單。大致上,若要解乙個給定問題,我們需要解其不同部分(即子問題),再根據子問題的解以得出原問題的解。動態規劃往往用於優化遞迴問題,例如斐波那契數列,如果運用遞迴的方式來求解會重複計算很多相同的子問題,利用動態規劃的思想可以減少計算量。

通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,具有天然剪枝的功能,從而減少計算量:一旦某個給定子問題的解已經算出,則將其記憶化儲存,以便下次需要同乙個子問題解之時直接查表。這種做法在重複子問題的數目關於輸入的規模呈指數增長時特別有用。

(1)題目要求

假設把某**的**按照時間先後順序儲存在陣列中,請問買賣該**一次可能獲得的最大利潤是多少?

示例 1:

輸入: [7,1,5,3,6,4]

輸出: 5

解釋: 在第 2 天(**** = 1)的時候**,在第 5 天(**** = 6)的時候賣出,最大利潤 = 6-1 = 5 。

注意利潤不能是 7-1 = 6, 因為賣出**需要大於****。

示例 2:

輸入: [7,6,4,3,1]

輸出: 0

解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

(2)解題思路

思路1:迴圈列表長度,取該子節點後的列表中的最大值裝進minprice容器中,若有大於0的值就返回minprice容器中的最大值。需要注意的是若開始輸入的就是空列表的情況

class

solution(object):

defmaxprofit(self, prices):

""":type prices: list[int]

:rtype: int

"""minprice=

for i in range(len(prices)-1):

begin =prices[i]

after =prices[i+1::]

if len(minprice)>0 and max(minprice)>0:

return

max(minprice)

else

:

return

0

(1)題目要求

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。

相鄰的結點 在這裡指的是下標與上一層結點下標相同或者等於上一層結點下標 + 1 的兩個結點。

例如,給定三角形:

[[2],

[3,4],

[6,5,7],

[4,1,8,3]

]自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。

(2)思路

最小路徑和,和dijsta演算法或者a*、d*演算法相似,如果只考慮當前路徑到下一路徑的最小值,顯然不合理。

Leetcode刷題 190713 動態規劃

輸入乙個陣列,陣列中每個元素代表乙個房子,我們作為robber可以對每個房子進行rob。但是規定不能同時又兩個相鄰的房子被robbed。陣列中每個元素的值代表房子的價值,需要我們輸出經過rob後最大的收益是多少。很明顯考察的是動態規劃,每檢查乙個房子都有兩種狀態即rob和no rob。對應的價值方程...

leetcode刷題總結 動態規劃

152乘積最大的連續子串行 圈複雜度很高,不要遺漏分支 vectormx len,0 vectormn len,0 213打家劫舍 ii 如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。vectors len,0 vectorn len,0 983最低票價 初始值特別要小心!我們定義 dp ...

LeetCode刷題 動態規劃(三)

最長公共子串行問題,最基本的問題是在兩個字串中找出最長公共字串。方法是使用雙指標 i,j遍歷兩個字串,建立二維 dp 陣列,通過填表獲得結果。1143,最長公共子串行,medium 583,兩個字串的刪除操作,medium 712,兩個字串的最小ascii刪除和,medium 1143,最長公共子串...