基本思想
動態規劃的基本思想是將待求解的問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解;這些求解的子問題往往不是相互獨立的;另外,在計算過程中需要將所有已解決的子問題的答案記錄在一個表中以避免大量的重複計算。
基本步驟:
- 找出最優解性質,刻畫其結構特徵
- 遞歸或迭代地定義最優值
- 自底向上的計算最優值
- 根據最優值,構造最優解
影響算法複雜度的因素
- 最優子結構問題(時間)
【最優子結構:最優解包含着子問題的最優解】 - 子問題的重疊問題(時間)
- 備忘錄大小(空間)
【對於動態規劃算法,因爲遞歸實現的效率不高,因此採用空間換時間的策略,記錄每個子問題首次計算的結果,後面再用時直接取值,每個子問題就計算一次】
適用條件
可用於求解組合優化問題,但是需要滿足優化原則或者最優子結構性質,即最優解包含着子問題的最優解。
經典案例
1、最短路徑
實例
起點集合是S,終點集合是T,輸出是一條從起點到終點的最短路,方法是從底向上的計算,先計算從C到終點的最短路徑,然後再依據C選擇的結果,計算B到T的最短路。
2、矩陣相乘
實例
僞碼
遞歸:
迭代:
迭代實現與遞歸實現的比較
3、0-1揹包問題
實例
追蹤解:
僞碼
4、圖像壓縮
設計思想
實例
僞碼
5、最優二叉樹
方法
實例
參考
mooc 算法分析與設計