《演算法導論》之動態規劃重構解
阿新 • • 發佈:2018-12-11
動態規劃(dynamic programming)就是把問題分解成一個個的子問題,然後對子問題進行求解。下面用通俗易懂的語言來解釋下動態規劃中關於重構解的理解。既儲存最優切割收益也儲存切割方案!
重構解
1、儲存最優切割收益也儲存切割方案的演算法
用 s[ j ] = i 來表示,長度為 j 的鋼條(當然在構建模型的時候也可以是其他含義)所得的最優解為 i 。 上述思想寫成BOTTOM-UP-CUT-ROD擴充套件版本如下: 其中,p[ i ]:長度為 i 的鋼條的價格;q:記錄長度為 j 的鋼條最優收益;r[ j ]:儲存每種情況的 q;s:整根鋼條的切割方案
- 第3句:求每種長度的情況的鋼條第一段切割的最優解。
- 第4句:初始化最優解值為負無窮。
- 第5句:從長度為 1 開始遍歷,一直到整根鋼條長度。計算出第一段長度該切割成多長才能獲得最優解,儲存在
s [ j ]=i
中。 - 第6句:
q
代表最優解收益,p[ i ] + r[ j - i ]
表示切割下的第一段長度為i
,剩下鋼條長度j - i
的最大收益為r[ j - i ]
,因此總收益即為p[ i ] + r[ j - i ]
。因此,當q<p[ i ] + r[ j - i ]
的時候,更新最優情況,s[ j ] = i
即切割第一段長度為i
時獲益最大。 - 當遍歷完所有的情況,即可知道當前長度為
j
的鋼條第一段切割多長可獲得最優收益。 因此,在本演算法中,不僅儲存了最優收益值p
r
(最大收益)和s
(切割方案)。
上述方案和BOTTOM-UP-CUT-ROD很相似,差別只是在第一行建立了陣列s(第一句),並將求解規模為 j 的子問題時,將第一段鋼條的最優切割長度 i 儲存在s[ j ]中了(第8句)。
2、呼叫上述函式並輸出鋼條切割方案 s 、最大收益 r
例如:長度為10 的鋼條有如下最優切割情況,呼叫BOTTOM-UP-CUT-ROD(p,10)。 從上述表格可以看出,長度為10 的鋼條不用切割即可獲得最大收益。若長度為7呢?可以看出是1,6的切割方案最合理。
參考資料: [1].《演算法導論》第三版