動態規劃的步驟是:
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個物品的價值。問把哪些物品裝入揹包使得物品價值總和最大,每個物品只能裝一次。舉例...