經典動態規劃學習記錄

2021-08-27 18:57:21 字數 1603 閱讀 4199

動態規劃本質是一種用空間換時間的優化方法,通常來優化可以暴力搜尋求解的問題,也就是去冗餘,把之前計算過的存下來,而且是規定了遞迴的計算順序,從簡單基本的出發,依次計算(這也是他優於記憶搜尋的地方)。方法大概如下:

1.首先能明白暴力遞迴怎麼實現(重要);

2.找到函式中可以代表遞迴過程的引數;

3.引數為key,結果為value,存入dict中,方便以後拿來用(記憶搜尋);

4.進一步整理狀態關係,如果二維先把第一行和第一列算出來,之後找到狀態方程(後續可能還可以優化)

學習過程中看了很多博文和理論,感覺理解還是一知半解,後來覺得自己是遇到這類問題最基本的暴力遞迴這裡就沒有想清楚,遇到的筆試題基本都不會,還是記錄下經典的幾道題吧(因為經典,所以需要記住動態規劃過程)。

輸入:乙個二維矩陣,從矩陣左上角(0,0)開始走,走到右下角,每次只能向右或向下走,則求所有路徑中路徑和最小的是多少

[

[1,3,5,9],

[8,1,3,4],

[5,0,6,1],

[8,8,4,0]

]輸出:12(1-3-1-0-6-1-0)

思路:

1.生成和輸入矩陣大小一樣的m*n矩陣;dp[i][j]的值為從(0,0)位置到(i,j)位置的最小路徑和;

2.對第一行元素來說,只能不斷右移,所以第一行就是不斷右移相加,第一列同理

[1,4,9,18],

[4 ],

[14 ],

[22 ]

3.考慮完dp[i][0]和dp[0][j],現在考慮dp[i][j]

因為每個位置都有兩種走法,所以對於dp[i][j]位置來說,他應該是當前位置的值加上min(dp[i-1][j],dp[i][j-1]),也就是dp[i][j] = m[i][j] + min(dp[i-1][j],dp[i][j-1])

思路大概就是這樣,這個相對比較好理解,**實現如下

def

findminlength

(array):

rows = len(array)

cols = len(array[0])

for i in range(1,rows): #第一列各位置初始化

array[i][0] += array[i-1][0]

for j in range(1,cols): #第一行各位置初始化

array[0][j] += array[0][j-1]

for i in range(1,rows): #按順序計算每個位置最小值存入array[i][j]

for j in range(1,cols):

array[i][j] += min(array[i-1][j],array[i][j-1])

print(array[-1][-1])

思路很簡單:f(n) = f(n-1)+f(n-2) 注意這裡預設開始在第一級,斐波那契數列稍微條件變了一點

def

jump

(n):

res = [0,1,2]

while len(res)1])

動態規劃學習記錄

動態規劃一般用陣列記錄下每一步的最優值,返回最後一步的值就是最優結果,相對於遞迴解法消除了重複計算的部分,提高的效率。計數 有多少種方式從a到b 多少種方式取得某值 求最優解 最大值最小值 路徑上最大資料和。存在性問題 能不能選出和為k的數 選定演算法前一定要判斷是否為動態規劃解題 有時候問題相似但...

動態規劃及其動態規劃經典例題

動態規劃是最重要 最經典的演算法之一,學好動態規劃對我們十分重要,掌握動態規劃對解決某些問題會起到事半功倍的效果。特點 可以把原始問題劃分為一系列子問題 求解每個子問題僅一次,並將其結果儲存到乙個表中,以後用到時直接訪問,不重複計算,節省時間。自底向上地計算 適用範圍 原問題可以分為多個相關子問題,...

動態規劃經典問題

from 實現在 維基百科對動態規劃的定義 動態規劃 英語 dynamic programming,簡稱dp 是一種在數學 電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題 1 和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於...