1. 程式人生 > 其它 >動態規劃(Dynamic Programming)

動態規劃(Dynamic Programming)

動態規劃與分治法相似,都是通過組合子問題的解來求解原問題(Programming在這裡指的是一種表格法,並非是編寫計算機程式),但是又有所不同

  • 分治法將問題分解為互不相交的子問題,遞迴求解子問題,再將它們的解組合起來,求出原問題的解。
  • 動態規劃應用於子問題重疊的情況,即不同的子問題具有公共的子子問題(子問題的求解是遞迴進行的,將其劃分為更小的子子問題):分治法會反覆地求解那些公共的子子問題;動態規劃演算法對每個子子問題只求解一次,將其儲存在一個表格中,從而無需每次求解一個子子問題時都重新計算,避免不必要的計算工作。

動態規劃通常用來求解最優化問題(optimization problem)—— 這類問題有很多可行的解,每個解都有一個值,我們希望尋找具有最優(最小值或最大值)的解,這樣的解稱為其中一個最優解(an optimal solution),而非就是最優解(the optimal solution),因為可能有多個解都達到最優值。通常按四個步驟

來設計一個動態規劃演算法:

  1. 刻畫一個最優解的結構特徵。
  2. 遞迴地定義最優解的值。
  3. 計算最優解的值,通常採用自底向上的方法。
  4. 利用計算出的資訊構造一個最優解。

步驟1~3是動態規劃演算法求解問題的基礎。如果我們僅僅需要一個最優解的值,而非解本身,可以忽略步驟4。如果確實需要做步驟4,有時就需要在執行步驟3的過程中維護一些額外信心,以便用來構造一個最優解。

 

常見用動態規劃求解的最優化問題

  • 鋼條切割
  • 矩陣鏈乘法
  • 最長公共子序列
  • 最優二叉搜尋樹