//矩陣鏈
//時間複雜度為o(n^3)
/*劃分子問題:
1、確定子問題的邊界: 每乙個子問題就是矩陣鏈的長度,邊界即矩陣鏈長度
2、將問題求解變成多步判斷的過程:找出子問題的最優解即 矩陣鏈中求出最小計算量
定義優化函式:
q=min
設計備忘錄:m[i][j]=q
設計標記函式:s[j][j]=k(k是括號位置)
*/#include
using
namespace std;
const
int int_max=
2147483647
;int
const m=6;
//矩陣個數
void
matrix_chain_order
(int
*p,int length,
int m[
][m]
,int s[
][m])}
}}}void
print_optimal_parens
(int s[
][m]
,int i,
int j)
}int
main()
;//矩陣行列數
int m[m]
[m],s[m]
[m];
//m中儲存矩陣i和j之間最小的計算次數,s記錄矩陣i和j中在哪個地方加括號,兩者均為備忘錄
matrix_chain_order
(p,m,m,s)
; cout<<
"當n=5時最優解為: \n"
<[5];
cout<<
"\n括號化方案為:\n"
;print_optimal_parens
(s,1,5
);return0;
}
#include
using
namespace std;
#define n 6
//六個矩陣
#define int_max 2147483647
int b[n]
[n];
int m[n]=;
/*過程就是從底層出發,
先求出矩陣鏈長度為2時的各個次數,
接著求出長度分別為3、4、5、6時的次數
對於每乙個長度,我們只新增乙個括號
子問題就是矩陣鏈的長度
b[1][5] =min(b[1][k]+b[k+1][5]+...)
*/void
matrixchain()
}}}int
main()
/*void matrixchain()
{ int num;
for(int i=1;i/*void matrixchain()
{ int num;
for(int i=0;i
其實矩陣鏈問題和平面凸多邊形最優三角劃分問題相似,不過求的權函式不是相乘了,而是相加。 動態規劃之矩陣鏈相乘
在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。問題描述 詳見演算法導論p197 p198 已知 給定n個矩陣構成的乙個矩陣鏈 a1,a2,an 矩陣ai的維數為pi 1 pi 求 決定該矩陣鏈的乘法結合順序 即加括號 使得矩陣鏈乘法的執行時間最短 ...
動態規劃之矩陣鏈乘法
雖然我們在 動態規劃之鋼條切割 裡面已經介紹過動態規劃的相關知識,這裡還是提一下動態的兩大特徵 1.最優子結構,原問題的解是在子問題的最優解的基礎上建立起來的 2.重疊子問題,即在不斷求解子問題的過程中會產生相同的子問題,而不是一直產生新的子問題 現在我們來看乙個例子,假設有三個矩陣 a1 10,1...
動態規劃之矩陣鏈乘法
給定乙個n個矩陣的序列,我們希望計算它的乘積 a1a2a3.an,我們可以用括號標定計算次序,然後再利用標準的矩陣乘法演算法來計算,由於矩陣乘法滿足結合律,所以任何一種計算順序最後的計算結果都是相同的。完全括號化的矩陣乘積鏈 它是單一矩陣,或者兩個完全括號化的矩陣乘積鏈的積,並且已經外加括號 例如矩...