演算法_動態規劃
分類:
一維DP:給一個數,求數的某種序列;
二維DP:給一個序列,求序列的子序列
一 解題流程
以求最小和為例:
所求:最小和
狀態:當前最小和,dp[i][j]
狀態轉移:dp[i][j]=min{dp[i-1][j],dp[i][j+1]}
終止條件:
初始化:
填表順序:
二 動態規劃經典問題:
2.1 鋼條切割
給定長度為n的鋼條和一個價格表,價格表中為鋼條長度與價格的關係,求切割方案使總價格最大。
長度 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
價格 | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |
2.1.1 分析
- 所求:最大價格
- 狀態:當前長度的最大價格dp[i]
- 狀態轉移:
做法一:
考慮將長度i劃分的所有方法,求其中的max
dp[i]=max{S[1]+dp[i-1],dp[2]+dp[i-1,…]}
【長度n有多少種分法?就是n可以由多少種整數加法運算得到?也就是n個球排列組合,最少一刀不切(切0刀),最多切n-1刀,為了簡單起見視為有順序的排列。切0刀有C(n-1,0)=1種可能,切1刀有C(n-1,1)=n-1種可能,切2刀有C(n-1,2)=(n-1)(n-2)/2種可能,切n-1刀有C(n-1,n-1)=1一種可能。沒法求了】乍一看這樣似乎能夠實現利用已經計算出的結果,但是可操作性很差。總得來看,DP要構建遞迴結構,這裡是作為迭代了,很難操作。感性上看,遞迴的以固定的方式分割,迭代是對問題分情況逐步解決。
做法二:
只講長度劃分為兩段,當前最優解為兩段最優解求和後的最大值
dp[i]=max{d[i-1]+dp[1],}
【迭代轉遞迴的一種思考方式:就像樹轉二叉樹一樣】
4 終止條件:
2.1.2 實現
- 初始化:
- 填表方向:
2.2 矩陣鏈乘法
矩陣鏈乘法,加括號控制運算順序,不會改變最終計算結果,但是可以影響計算量。現在要求給矩陣鏈加括號,使得運算量最小。
與上面的鋼條分割一樣,是一個全域性分割方案的問題,且某一段的分割方式會影響前後段對應的結果值。直接套用一分為二遞迴。
2.2.1分析
- 所求:最小運算量
- 狀態:當前矩陣鏈的最小運算量
- 狀態轉移:
dp[i][j]= min{
dp[i][i+1]+dp[i+1][j]+F(i,i+1,j),
...
dp[i][k]+dp[k][j]+F(i,k,j),
...
dp[i][j-1]+dp[j-1][j]+F(i,j-1,j)
}
dp[i][i+k] 需要儲存的資訊:計算量、計算結果形狀(開始矩陣的行,末尾矩陣的列)
F(dp[i][k],dp[k][j]):計算矩陣(i...k)和矩陣(k+1...j)做乘法的計算量,只用到i的行,k的列,j的列即可計算
- 終止條件:
i+1<j
j-1>i
==> j-i > 1
==> j-i = 2,3,... 也就是中間至少可以插一個k
i...j長度為1或2時,可以直接初始化求出來
關於終止條件和初始化:
終止條件這裡用 i+1<=j,行不行?大概也是可行的。但這樣狀態轉移方程的情況似乎更復雜。
實際上動態規劃中所有值都是會被求出來的,要麼是在初始化時,要麼是在狀態轉移時,那當然是讓狀態轉移方程情況越簡單越好。
所以,應該選擇對狀態轉移方程中條件約束更嚴格,將邊界情況放到初始化時去做,這樣狀態轉移方程更簡單清晰。
2.2.2 實現
- 初始化:
長度為1、2的都初始化算出來
- 填表方向:
dp[i][j] 在狀態轉移方程中已經規定j>i,所以只填右上部分即可
dp[i][i+1]+dp[i+1][j]+F(i,i+1,j)、dp[i][j-1]+dp[j-1][j]+F(i,j-1,j) 可以看到當前值依賴於i更大、j更小時的格子中的值
所以按照如下方式填表
for i= 大->小
for j= 小->大
================================================
上面兩種問題,都可以視為區間分割問題:
一個區間由多個基本單元組成,現在要將基本單元分組,分組方式會影響目標值,求最優分組方式。
鋼條分割問題中,一個單位長度就是一個基本單元;中間任意擷取一個長度時,會影響前後段的結構,導致前後端輸出值變化。
矩陣鏈乘法問題中,一個矩陣就是一個基本單元;中間任意擷取一段矩陣時,會影響前後段的結構,導致前後端輸出值變化。
這種分割問題,用遞迴的思路就是不停地二分,用迭代就是逐個討論分割的段數(分兩段、分三段…),動態規劃解法根據遞迴二分的思路。
====================================
2.2.3 完全揹包
容量一定,多個物體體積一定,物體價值不同,求價值最大/最小方案。
變形:將物體價值視為相同,可求物體數量最多/最少方案。
相關文章
- 演算法-動態規劃演算法動態規劃
- 動態規劃演算法動態規劃演算法
- 演算法系列-動態規劃(1):初識動態規劃演算法動態規劃
- 前端演算法 - 動態規劃前端演算法動態規劃
- 初級演算法-動態規劃演算法動態規劃
- 【每日演算法】動態規劃四演算法動態規劃
- 演算法(七):圖解動態規劃演算法圖解動態規劃
- 演算法-動態規劃-完全揹包演算法動態規劃
- 動態規劃動態規劃
- 演算法---貪心演算法和動態規劃演算法動態規劃
- 演算法筆記之動態規劃(4)演算法筆記動態規劃
- Leetcode 題解演算法之動態規劃LeetCode演算法動態規劃
- 矩陣連乘(動態規劃演算法)矩陣動態規劃演算法
- 動態規劃之 KMP 演算法詳解動態規劃KMP演算法
- 動態規劃演算法原理與實踐動態規劃演算法
- 動態規劃演算法(DP)學習<1>動態規劃演算法
- [leetcode] 動態規劃(Ⅰ)LeetCode動態規劃
- 動態規劃法動態規劃
- 模板 - 動態規劃動態規劃
- 動態規劃初步動態規劃
- 動態規劃分析動態規劃
- 動態規劃(DP)動態規劃
- [leetcode初級演算法]動態規劃總結LeetCode演算法動態規劃
- 演算法基礎--遞迴和動態規劃演算法遞迴動態規劃
- 乾貨:圖解演算法——動態規劃系列圖解演算法動態規劃
- 動態規劃演算法——裝最多水的容器動態規劃演算法
- 最小總和問題(動態規劃演算法)動態規劃演算法
- 大廠常考動態規劃演算法題動態規劃演算法
- 聊聊不太符合常規思維的動態規劃演算法動態規劃演算法
- 動態規劃小結動態規劃
- [leetcode 1235] [動態規劃]LeetCode動態規劃
- 動態規劃專題動態規劃
- 動態規劃-----線性動態規劃
- 好題——動態規劃動態規劃
- 動態規劃初級動態規劃
- 淺談動態規劃動態規劃
- 3.動態規劃動態規劃
- 動態規劃題單動態規劃