求解問題分為多個階段或多個子問題,然後按順序求解各個問題,最後乙個子問題就是初始問題的解。
動態規劃=貪婪策略+遞推+儲存遞推結果
空間換取時間
基本要素:
最優化子結構性質和重疊子問題性質
階段:把問題分為幾個相互聯絡的有順序的幾個環節,這些稱為階段。
狀態:某一階段發出的位置稱為狀態。
決策:從某一階段的乙個狀態演變到下乙個階段的某乙個狀態的選擇。
狀態轉移方程
最優化原理:最優子結構
無後向性:某狀態一旦確定後,就不受這個狀態以後決策的影響。
(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的定義易知,當...