動態規劃(dynamic programming)

2021-08-04 06:34:40 字數 2018 閱讀 9976

什麼是動態規劃?

給定該陣列arr,arr中所有的值都為整數且不重複。每個值代表一種面值的貨幣。每種面值的貨幣可以使用任意張。再給定給乙個整數aim代表要找的錢數,求換錢有多少種方法。

暴力搜尋方法(利用遞迴)的缺點在於有很多的重複計算。比如:arr=已經使用0張5元和1張10元的情況下,後序將求:p1(arr,2,990).

當已經使用2張5元和0張10元的情況下,後續還是要求p1(arr,2,990).因為有很多的重複計算,所以暴力搜尋的時間複雜度非常高!!

記憶搜尋方法:重複計算的原因在於每一次的遞迴結果都沒有記錄下來,所以每一次都要重複計算。

暴力搜尋方法的函式p1(arr,index,aim)其中arr是始終不變的,而index和aim是變化的,並且可以代表遞迴過程。p(index,aim)。

1. 利用雜湊表map,每計算完乙個p(index,aim)都講結果放入map中,index和aim組成共同的key,返回結果為value。

2. 要進入乙個遞迴過程p(index,aim),先以index和aim的key在map中查詢是否已經存放value,如果存在,則直接取值,如果不存在,才進行遞迴計算。

下面是記憶搜尋方法的**實現:

因為本題的遞迴過程可以由兩個變數進行表示,index和aim,所以只需要申請二維的map就可以。二維陣列map[i][j]的結果代表p(i,j)的返回結果,每次進入下一次遞迴之前,都要先查詢map是否計算過,如果計算過直接取出來用就可以。

記憶搜尋方法與動態規劃方法的聯絡:

1. 記憶化搜尋方法就是某種形態的動態規劃方法。複雜度也是o(aim*aim)

2. 記憶化搜尋方法不關心到達某乙個遞迴過程的路徑,只是單純地對計算過的遞迴過程進行記錄,避免重複的遞迴過程。

3.動態規劃的方法則是規定好每乙個遞迴過程的計算順序,依次進行計算,後面的計算過程嚴格依賴前面的計算過程。

4. 兩者都是空間換時間的方法,也都有列舉的過程。區別在於動態規劃規定計算順序,而記憶搜尋不用規定。

動態規劃方法:

1. 其本質是利用申請的空間來記錄每乙個暴力搜尋的計算結果。下次要用的結果的時候直接使用,而不在進行重複的遞迴過程。

2. 動態規劃規定給每一種遞迴狀態的計算順序,依次進行計算。

對於上面的動態規劃來說,因為不用進行列舉過程,直接使用公式dp[i][j]=dp[i][j-arr[i]]+dp[i-1][j],所以時間複雜度少了乙個aim,變成了o(n*aim).

面試中遇到的暴力遞迴題目可以優化成動態規劃方法的大體過程:

1. 實現暴力遞迴方法。

2. 在暴力搜尋方法的函式中看看哪些引數可以代表遞迴過程。

3. 找到代表遞迴過程的引數之後,記憶化搜尋的方法非常容易實現。只需要將遞迴過程的引數整體當做key,遞迴過程的值當做value,放到map中就可以了。

4. 通過分析記憶化搜尋的依賴路徑,進而實現動態規劃。(簡單的可以先得到的先計算,大部分情況下為map的第一行和第一列。)

5. 通過記憶化搜尋方法改出動態規劃方法,進而看看是否能化簡,如果能化簡,還能實現時間複雜度更低的動態規劃方法。(比如說是否能推出公式)

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...

mysql動態規劃 動態規劃

動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...

《動態規劃》 ACM 動態規劃例題詳解

描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...