演算法_動態規劃

IMchg發表於2020-12-23

分類:
一維DP:給一個數,求數的某種序列;
二維DP:給一個序列,求序列的子序列

一 解題流程

以求最小和為例:
所求:最小和
狀態:當前最小和,dp[i][j]
狀態轉移:dp[i][j]=min{dp[i-1][j],dp[i][j+1]}
終止條件:

初始化:
填表順序:

二 動態規劃經典問題:

2.1 鋼條切割

給定長度為n的鋼條和一個價格表,價格表中為鋼條長度與價格的關係,求切割方案使總價格最大。

長度12345678910
價格1589101717202430
2.1.1 分析
  1. 所求:最大價格
  2. 狀態:當前長度的最大價格dp[i]
  3. 狀態轉移:
    做法一:
    考慮將長度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 實現
  1. 初始化:
  2. 填表方向:

2.2 矩陣鏈乘法

矩陣鏈乘法,加括號控制運算順序,不會改變最終計算結果,但是可以影響計算量。現在要求給矩陣鏈加括號,使得運算量最小。

與上面的鋼條分割一樣,是一個全域性分割方案的問題,且某一段的分割方式會影響前後段對應的結果值。直接套用一分為二遞迴。

2.2.1分析
  1. 所求:最小運算量
  2. 狀態:當前矩陣鏈的最小運算量
  3. 狀態轉移:
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的列即可計算
  1. 終止條件:
i+1<j
j-1>i
==> j-i > 1
==> j-i = 2,3,...		也就是中間至少可以插一個k

i...j長度為12時,可以直接初始化求出來

關於終止條件和初始化:
終止條件這裡用 i+1<=j,行不行?大概也是可行的。但這樣狀態轉移方程的情況似乎更復雜。
實際上動態規劃中所有值都是會被求出來的,要麼是在初始化時,要麼是在狀態轉移時,那當然是讓狀態轉移方程情況越簡單越好。
所以,應該選擇對狀態轉移方程中條件約束更嚴格,將邊界情況放到初始化時去做,這樣狀態轉移方程更簡單清晰。
2.2.2 實現
  1. 初始化:
長度為12的都初始化算出來
  1. 填表方向:
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 完全揹包

容量一定,多個物體體積一定,物體價值不同,求價值最大/最小方案。

變形:將物體價值視為相同,可求物體數量最多/最少方案。

相關文章