演算法分析 動態規劃

2021-10-13 21:39:17 字數 1808 閱讀 3930

求解問題分為多個階段或多個子問題,然後按順序求解各個問題,最後乙個子問題就是初始問題的解。

動態規劃=貪婪策略+遞推+儲存遞推結果

空間換取時間

基本要素:

最優化子結構性質和重疊子問題性質

階段:把問題分為幾個相互聯絡的有順序的幾個環節,這些稱為階段。

狀態:某一階段發出的位置稱為狀態。

決策:從某一階段的乙個狀態演變到下乙個階段的某乙個狀態的選擇。

狀態轉移方程

最優化原理:最優子結構

無後向性:某狀態一旦確定後,就不受這個狀態以後決策的影響。

(1)劃分階段(2)選擇狀態(3)確定決策並寫出狀態轉移方程

1.數塔問題

乙個數塔,可以選擇向左或者向右走,要求走出一條路徑,數值和最大。

狀態轉移方程:

//狀態轉移方程

if(a[i+1]

[j]>a[i+1]

[j+1])

else

#include

using

namespace std;

intmain()

}//自下而上

for(

int i=n-

1;i>=

1;i--

)else}}

cout<[1];

}

2.n個矩陣連乘問題

不會3.求兩個字串的最長公共字元子串行

詳情見這裡

4.求乙個數列最長不降子串行

詳情見這裡

5.0-1揹包問題

給定的n種物品和乙個揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,是的其物品價值最大。

狀態方程:

//狀態轉移方程

if

(j)else

memset

(m,0

,sizeof

(m))

;//初始化為0;

for(

int i=

1;i<=n;i++

)else}}

cout<[c];

//輸出最終值

}

6.最大欄位和

給定n個元素的整數列,找到其中字段,使得其和最大

狀態轉移方程

dp[i]

=max

(a[i]

,dp[i-1]

+a[i]

);

#include

using

namespace std;

intmian()

;int dp[

100]=;

cin>>n;

for(

int i=

0;i)for

(int i=

0;i)int k=0;

for(

int i=

1;icout<;return0;

}

演算法分析 動態規劃

一 動態規劃定義 通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。二 動態規劃與貪心演算法區別 已知問題規模為n的前提a,求解乙個未知解b。我們用an表示 問題規模為n的已知條件 此時,如果把問題規模降到0,即已知a0,可以得到a0 b.上述兩種狀態轉移圖如下圖所示 三 動態規劃原理 能...

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

最優子結構性質 假設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的定義易知,當...