動態規划(基礎篇)


1.什么是動態規划:

動態規划,和分治法一樣,是通過組合子問題的解而解決整個問題的。但不同的是,分治算法是指將問題划分成一些獨立的子問題,遞歸求解各子問題,然后合並子問題的解而得到原問題的解。而動態規划適用於子問題不是獨立的情況,也就是各子問題包含公共的子子問題。動態規划對每個子子問題只求解一次,將其結果保存在一張表中,從而避免每次遇到各個子問題時重新計算答案。

 

2.動態規划中的幾個重要性質:

2.1最優子結構:

用動態規划求最優化問題的第一步是描述最優解的結構。如果問題的一個最優解中包含子問題的最優解,則該問題具有最優子結構。當一個問題具有最優子結構時,提示我們動態規划可能會適用(注意,在這種情況下,貪心策略可能也是適用的)在動態規划中,我們利用子問題的最優解來構造問題的一個最優解。不妨舉例說明,對於0-1背包問題中,若f[i][j]表示考慮前i個物品,背包容量是j時的背包內物品的最大值,則f[i][j] = max { f[i-1][j] , f[i-1][j-V[i]] } ,那么若f[i-1][j] 或者f[i-1][j-V[i]]不是最優的,則f[i][j]也不會是最優解,這就是最優子結構。

 2.2重復子問題:

所謂的重疊子問題,既當一個遞歸算法不斷調用同一個問題時,我們說該最優問題包含重疊子問題的情況,針對這種情況提出了兩種方案,一是:記憶化搜索(即備忘錄算法);二是:自底向上的遞推。這也是dp思想的關鍵所在。具體可以參見數字三角形的例子(參見劉汝佳《算法競賽入門經典》),重復計算d(3,2),d(4,2)和d(4,3)的情況。

 2.3狀態:

狀態是一個很重要的概念,如果算法基礎過關,那么,成功的為一個題目設計出狀態的時候,動態規划已經完成了一大半。其實對於一個實際問題,要是能識別出來是用dp方法解決,並且能定義狀態,問題就豁然開朗了。下一步就是找粗狀態轉移方程了。

 2.4狀態轉移方程:

狀態轉移方程是動態規划算法的核心所在,是實現算法的關鍵。動態規划中本階段的狀態往往是上一階段狀態和上一階段決策的結果。也就是從一個狀態到另一個狀態用到的公式。例如0-1背包中的f[i][j] = max { f[i-1][j] , f[i-1][j-V[i]] }。

 

3.動態規划什么時候用:

動態規划通常應用於最優化問題。這類問題可能有許多種可行解,每個解都有一個值,而我們希望找到一個具有最優(最大或最小)值的解。稱這樣的問題為該問題的“一個”最優解(而不是“確定的”最優解),因為可能存在多個取最優解的值。

動態規划使用的基本條件就是:

1)最優子結構性質

2)子問題重疊性質

在應用動態規划時,對於重復出現的子問題,只需在第一次遇到時加以求解,並把答案保存起來,以便以后再遇到時直接引用,不必重新求解,從而大大地提高解題的效率。相比之下,一般的搜索技術,對於某個子問題,不管是否已經求解過,只要遇上,就會再次對它求解,因而影響了解題的效率。

 

4.動態規划算法實現的兩種方式:

數字三角形的問題描述:有一個由非負整數組成的三角形,第一行只有一個數,除了最下面一行之外每個數的左下方和右下方各有一個數

    1

   3  2

  4  10  1

 4    3      2     20

4.1記憶化搜索:

Int d(int I ,int j)

{

  Ifd[i][j] >=0 return d[i][j];

  return d[i][j] = a[i][j]+(I ==n ? 0 : d[i+1][j] >?d[i+1][j+1]);

}

所謂的記憶化搜索,是若算過d[i][j]則進行記錄,下次用到d[i][j]時直接用就可以了。這也是此題用dp和遞歸求解的主要區別。

4.2遞推計算:

int I,j;

for(j = 1 ; j <= n ; j++) d[n][j] = a[n][j];

for(i = n-1 ; i >=1 ; i--)

{

  for(j = 1 ; j <=I ; j++)
  {

    d[i][j] = =a[i][j]+d[i+1][j]>?d[i+1][j+1];

  }

}

這里的遞推其實和記憶化搜索是差不多的,只是遞推算法是自底向上的,需要明確各個狀態的計算順序。而記憶化搜索要記錄每個狀態是否已經算過。

 

5.動態規划算法例題:

數字三角形問題:典型例題

0-1背包問題:多階段決策問題

DAG上的動態規划:把問題建模到圖上,運用動態規划

 

6.使用動態規划應注意的問題:

6.1初值問題:

6.2狀態轉移過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM