1. 程式人生 > >演算法設計與分析——動態規劃

演算法設計與分析——動態規劃

這幾天在leetcode上刷了不少動態規劃的題,在這裡來總結一下。

動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題。但是經分解得到的子問題往往不是互相獨立的。不同子問題的數目常常只有多項式量級。在用分治法求解時,有些子問題被重複計算了許多次。如果能夠儲存已解決的子問題的答案,而在需要時再找出已求得的答案,就可以避免大量重複計算,從而得到更加快速的解法。

一. 動態規劃的基本步驟

  • 找出最優解的性質,並刻劃其結構特徵。
  • 遞迴地定義最優值。
  • 以自底向上的方式計算出最優值。
  • 根據計算最優值時得到的資訊,構造最優解。

二. 動態規劃演算法的基本要素

  • 最優子結構性質

    原問題的最優解包含著其子問題的最優解,這種性質稱為最優子結構性質。利用問題的最優子結構性質,以自底向上的方式遞迴地從子問題的最優解逐步構造出整個問題的最優解。最優子結構是問題能用動態規劃演算法求解的前提。

  • 重疊子問題性質

    遞迴演算法求解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。這種性質稱為子問題的重疊性質。動態規劃演算法,對每一個子問題只解一次,而後將其解儲存在一個表格中,當再次需要解此子問題時,只是簡單地用常數時間檢視一下結果。