演算法1 動態規劃

2022-04-03 02:12:18 字數 1896 閱讀 9076

動態規劃的步驟是:

1.找出最優解的特徵,並刻畫其結構特徵;

2.遞迴地定義最優值;

3.以自底向上的方式計算出最優值;

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

動態規劃演算法的有效性依賴於兩個最重要的性質:最優子結構性質和重疊子問題性質。

栗子1,矩陣連乘問題。

1

//動態規劃——矩陣連乘問題

2 #include3 #include4

5using

namespace

std;

6int p[7]=;//

6個矩陣

7int m[6][6];//

存放計算量的矩陣

8int s[6][6];//

存放分割點的矩陣910

void matrixchain()//

第三步:計算最優值(前面兩步沒法再**中體現,是構思的過程)

11//

生成斷點矩陣的函式,計算出最優值,返回s矩陣

1232}33

}34}35

}36void traceback(int i,int j)//

第4步:構造最優解。輸入s矩陣和想要求解的範圍,輸出最佳的括號方案

3743 cout<<"("

;44traceback(i,s[i][j]);

45 traceback(s[i][j]+1

,j);

46 cout<<")"

;47}48

intmain()

49

栗子2:最長公共子串行

1

//動態規劃-最長公共子串行

2 #include3

using

namespace

std;

4char x[8]=;//

函式中根本不會計算x[0]和y[0],這兩個位置的字母只是為了佔坑用

5char y[7]=;

6int c[8][7]=;//

子串行的長度

7int b[8][7]=;//

子串行以哪種方式可以找到它最長子序列。遞迴方式8//

計算最優值

9void

lcslength()

1022

else

2329

else

303435}

3637}38

}39}40

//構造最優解

41void lcs(int i,int j)//

輸出子串行和其長度

4250

else

5156

else

576061}

6263

6465}66

intmain()

67

在牛客上提交的版本,牛客只需要輸出最長公共子串行的長度

1

//動態規劃-最長公共子串行

2 #include3

using

namespace

std;

4void lcslength(char x,char y,int m,intn)5

12int b[m+1][n+1];//

子串行以哪種方式可以找到它最長子序列。遞迴方式

13for(int i=0;i1;i++)

1418

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

1927

else

2834

else

353940}

4142}43

}44 cout46void

lcs()

4762}63

intmain()

64

演算法 動態規劃(1)

把問題拆分成若干個子問題,類似遞迴 分治 但是動規多用於處理最優解,有重疊子問題的問題,因為動態規劃對於重疊子問題不會反覆計算,會建立一張表將之前計算過的子問題答案直接儲存,避免了重複計算,加快計算速度 練習1 有8個任務,每個任務完成需要一定的時間,完成之後就會有相應的報酬 圖上的紅色字段 但是任...

演算法筆記 動態規劃1

動態規劃適合求解最優問題,比如最大值最小值等。它可以顯著的降低時間複雜度,提高 的執行效率。0 1 揹包問題 在上篇總結中,用回溯演算法解決了 0 1揹包問題。但是,在求解的過程中,我們應該能想象的出,有些步驟是一直在重複執行。如果揹包的總載重為 9 物品個數為 5 質量分別為 2,2,4,6,3 ...

演算法筆記 動態規劃 1

求解方法 標準的01揹包問題是指,有n int型 個物品和最多裝重量w int型 的揹包。weight陣列表示物品的重量,即weight i 表示第i個物品的重量 value陣列表示物品的價值,即value i 表示第i個物品的價值。問把哪些物品裝入揹包使得物品價值總和最大,每個物品只能裝一次。舉例...