1. 程式人生 > >演算法——動態規劃

演算法——動態規劃

一、動態規劃

動態規劃問題是面試題中的熱門話題,如果要求一個問題的最優解(通常是最大值或者最小值),而且該問題能夠分解成若干個子問題,並且小問題之間也存在重疊的子問題,則考慮採用動態規劃。

使用動態規劃特徵: 
1. 求一個問題的最優解 
2. 大問題可以分解為子問題,子問題還有重疊的更小的子問題 
3. 整體問題最優解取決於子問題的最優解(狀態轉移方程) 
4. 從上往下分析問題,從下往上解決問題 
5. 討論底層的邊界問題

動態規劃的重點:遞迴方程+邊界條件

二、例項講解

1.初級  

(1)揹包問題:有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入物品具有最大價值總和?

未完待續。。

 三、總結

1.能用動規解決的問題的特點

 1) 問題具有最優子結構性質。如果問題的最優解所包含的 子問題的解也是最優的,我們就稱該問題具有最優子結 構性質。

 2) 無後效性。當前的若干個狀態值一旦確定,則此後過程的演變就只和這若干個狀態的值有關,和之前是採取哪種手段或經過哪條路徑演變到當前的這若干個狀態,沒有關係。

2.遞迴到動規的一般轉化方法

遞迴函式有n個引數,就定義一個n維的陣列,陣列的下標是遞迴函式引數的取值範圍,陣列元素的值是遞迴函式的返回值,這樣就可以從邊界值開始, 逐步填充陣列,相當於計算遞迴函式值的逆過程。 

3. 動規解題的一般思路

1. 將原問題分解為子問題

  •     把原問題分解為若干個子問題,子問題和原問題形式相同或類似,只不過規模變小了。子問題都解決,原問題即解決(數字三角形例)。
  •     子問題的解一旦求出就會被儲存,所以每個子問題只需求 解一次。

2.確定狀態

  •     在用動態規劃解題時,我們往往將和子問題相關的各個變數的一組取值,稱之為一個“狀 態”。一個“狀態”對應於一個或多個子問題, 所謂某個“狀態”下的“值”,就是這個“狀 態”所對應的子問題的解。
  •     所有“狀態”的集合,構成問題的“狀態空間”。“狀態空間”的大小,與用動態規劃解決問題的時間複雜度直接相關。 在數字三角形的例子裡,一共有N×(N+1)/2個數字,所以這個問題的狀態空間裡一共就有N×(N+1)/2個狀態。

    整個問題的時間複雜度是狀態數目乘以計算每個狀態所需時間。在數字三角形裡每個“狀態”只需要經過一次,且在每個狀態上作計算所花的時間都是和N無關的常數。

3.確定一些初始狀態(邊界狀態)的值

    以“數字三角形”為例,初始狀態就是底邊數字,值就是底邊數字值。

4. 確定狀態轉移方程

     定義出什麼是“狀態”,以及在該“狀態”下的“值”後,就要找出不同的狀態之間如何遷移――即如何從一個或多個“值”已知的 “狀態”,求出另一個“狀態”的“值”(遞推型)。狀態的遷移可以用遞推公式表示,此遞推公式也可被稱作“狀態轉移方程”。

    數字三角形的狀態轉移方程: