演算法分析 動態規劃

2022-07-07 06:27:14 字數 1967 閱讀 5389

一、動態規劃定義

通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。

二、動態規劃與貪心演算法區別

已知問題規模為n的前提a,求解乙個未知解b。(我們用an表示「問題規模為n的已知條件」)

此時,如果把問題規模降到0,即已知a0,可以得到a0->b.

上述兩種狀態轉移圖如下圖所示:

三、動態規劃原理

能採用動態規劃求解的問題的一般要具有3個性質:

(1) 最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。

(2) 無後效性:即某階段狀態一旦確定,就不受這個狀態以後決策的影響。也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關。

四、動態規劃解題的一般思路   

動態規劃所處理的問題是乙個多階段決策問題,一般由初始狀態開始,通過對中間階段決策的選擇,達到結束狀態。這些決策形成了乙個決策序列,同時確定了完成整個過程的一條活動路線(通常是求最優的活動路線)。如圖所示。動態規劃的設計都有著一定的模式,一般要經歷以下幾個步驟。

五、演算法實現的說明

動態規劃的主要難點在於理論上的設計,也就是上面4個步驟的確定,一旦設計完成,實現部分就會非常簡單。

使用動態規劃求解問題,最重要的就是確定動態規劃三要素:

(1)問題的階段 (2)每個階段的狀態

(3)從前乙個階段轉化到後乙個階段之間的遞推關係。

遞推關係必須是從次小的問題開始到較大的問題之間的轉化,從這個角度來說,動態規劃往往可以用遞迴程式來實現,不過因為遞推可以充分利用前面儲存的子問題的解來減少重複計算,所以對於大規模問題來說,有遞迴不可比擬的優勢,這也是動態規劃演算法的核心之處。

確定了動態規劃的這三要素,整個求解過程就可以用乙個最優決策表來描述,最優決策表是乙個二維表,其中行表示決策的階段,列表示問題狀態,**需要填寫的資料一般對應此問題的在某個階段某個狀態下的最優值(如最短路徑,最長公共子串行,最大價值等),填表的過程就是根據遞推關係,從1行1列開始,以行或者列優先的順序,依次填寫**,最後根據整個**的資料通過簡單的取捨或者運算求得問題的最優解。

f(n,m)=max

演算法實現的步驟

1、建立乙個一維陣列或者二維陣列,儲存每乙個子問題的結果,具體建立一維陣列還是二維陣列看題目而定,基本上如果題目中給出的是乙個一維陣列進行操作,就可以只建立乙個一維陣列,如果題目中給出了兩個一維陣列進行操作或者兩種不同型別的變數值,比如揹包問題中的不同物體的體積與總體積,找零錢問題中的不同面值零錢與總錢數,這樣就需要建立乙個二維陣列。

注:需要建立二維陣列的解法,都可以建立乙個一維陣列運用滾動陣列的方式來解決,即一位陣列中的值不停的變化,後面會詳細徐敘述

2、設定陣列邊界值,一維陣列就是設定第乙個數字,二維陣列就是設定第一行跟第一列的值,特別的滾動一維陣列是要設定整個陣列的值,然後根據後面不同的資料加進來變幻成不同的值。

3、找出狀態轉換方程,也就是說找到每個狀態跟他上乙個狀態的關係,根據狀態轉化方程寫出**。

4、返回需要的值,一般是陣列的最後乙個或者二維陣列的最右下角。

**基本框架:

1

for(j=1; j<=m; j=j+1) //

第乙個階段

2 xn[j] =初始值;34

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

其他n-1個階段

5for(j=1; j>=f(i); j=j+1)//

f(i)與i有關的表示式

6 xi[j]=j=max(或min);

78 t = g(x1[j1:j2]); //

由子問題的最優解求解整個問題的最優解的方案910

print(x1[j1]);

1112

for(i=2; i<=n-1; i=i+1)13

view code

[1][2]

演算法分析 動態規劃

求解問題分為多個階段或多個子問題,然後按順序求解各個問題,最後乙個子問題就是初始問題的解。動態規劃 貪婪策略 遞推 儲存遞推結果 空間換取時間 基本要素 最優化子結構性質和重疊子問題性質 階段 把問題分為幾個相互聯絡的有順序的幾個環節,這些稱為階段。狀態 某一階段發出的位置稱為狀態。決策 從某一階段...

演算法分析 動態規劃 矩陣連乘

最優子結構性質 假設a1 a2 a3 an在k處斷開為最優,那麼只需要保證a1 ak和ak an兩個子串行的分割也是最優,就能保證該結果是最優。子問題重疊性 對於多個矩陣連乘,不同的分割次序會導致計算次數的不同,所以要找到最優化的分割,減少計算量。a1a2 a3a4 a5a6 30 35 35 15...

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

最大子段和問題 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。i.當所有整數均為負值時定義其最大子段和為0。所求的最優值為 i.例如,當 a1,a2,a7,a8 1,3,7,8,4,12,10,6 時,最大子段和為 bj是1到j位置的最大子段和 由bj的定義易知,當...