演算法 動態規劃

2021-08-21 13:10:59 字數 991 閱讀 8306

動態規劃的定義:

動態規劃是運籌學的乙個分支,是求解決策過程的最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃。在各種演算法中,我認為動態規劃是較難掌握好的,主要難在模型的建立。

解題的一般步驟是:

1.找出最優解的性質,刻畫其結構特徵和最優子結構特徵;

2.遞迴地定義最優值,刻畫原問題解與子問題解間的關係;

3.以自底向上的方式計算出各個子問題、原問題的最優值,並避免子問題的重複計算;

4.根據計算最優值時得到的資訊,構造最優解。

話不多說,我們來看幾個具體的例子慢慢理解它:

1.矩陣連乘

給定n個可連乘的矩陣,根據矩陣乘法結合律,可有多種不同計算次序,每種次序有不同的計算代價,也就是數乘次數。例如給定2個矩陣a[pi,pj]和b[pj,pk],a×b為[pi,pk]矩陣,數乘次數為pi×pj×pk。將矩陣連乘積ai…aj簡記為a[i:j] ,這裡i≤j。考察計算a[i:j]的最優計算次序,設這個計算次序在矩陣ak和ak+1之間將矩陣鏈斷開,i≤k#include#includeusing namespace std;

int dp[maxn][maxn],a[maxn];

int main()

} dp[1][1]=********[1][1];

for(int i=2;i<=n;i++) }

int max=-1;

for(int i=1;i<=n;i++)

cout<#include#includeusing namespace std;

int ********[110][110],dp[110][110];

int main()

} for(int i=1;i<=n;i++)

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

cout<

演算法 動態規劃

動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...

演算法 動態規劃

1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...

演算法 動態規劃

2.青蛙跳台階 3.最大連續子陣列和 4.字串分割 5.路徑總數 6.路徑總數 有障礙版 7.最小路徑和 1.1遞迴法class test else if n 1 n 2 else return fibonacci n 1 fibonacci n 2 1.2動態規劃 初始狀態 f 1 f 2 1 狀...