內容: n個矩陣連乘,不滿**換律,但是滿足結合律,通過不同的加括號方式,會使得需要的乘法次數不同。用動態規劃方法計算,找出最優加括號方式,使總的乘法次數最少。
下面我們考慮用動態規劃求解。
預處理:
將矩陣連乘積aiai+1…aj簡記為a[i:j],這裡i≤j。
考察計算a[i:j]的最優計算次序。設這個計算次序在矩陣ak和ak+1之間將矩陣鏈斷開,i≤k#include
#include
using
namespace std;
const
int sz=20;
void
matrixchain
(int
*p,int m[sz]
[sz]
,int s[sz]
[sz]
,int length)
//r=2為對角線緊鄰的右上位置,隨著r的增大,即沿著右上角的方向遞增,擴大鏈的長度
for(
int r =
2; r <= length; r++)}
}}}//輸出陣列的值
void
printmatrix
(int m[sz]
[sz]
,int length)
cout << endl;}}
//通過遞迴輸出最優的劃分
void
printresult
(int s[sz]
[sz]
,int i,
int j)
else
//是否需要再新增一種情況:兩個矩陣,加括號輸出??
}int
main()
cout <<
"你輸入的矩陣為:"
<< endl;
for(
int i =
0; i
) cout << endl;
cout <<
"m矩陣為:"
<< endl;
matrixchain
(p, m, s, n)
;printmatrix
(m, n)
; cout <<
"s矩陣為:"
<< endl;
printmatrix
(s, n)
;printresult
(s,1
, n)
;system
("pause");
return0;
}執行結果為:
矩陣連乘問題(動態規劃演算法)
動態規劃演算法思想簡介 將乙個問題分解為多個子問題,這點和分治法類似,但是每個子問題不是獨立的而是相互聯絡的,所以我們在求解每個子問題的時候可能需要重複計算到其他的子問題,所以我們將計算過的子問題的解放進乙個表中,這樣就能避免了重複計算帶來的耗費,這就是動態規劃的基本思想 一般地,動態規劃思想一般用...
矩陣連乘的動態規劃演算法
矩陣鏈乘問題 輸入 共兩行 第一行 n 1 n 100 代表矩陣個數。第二行有 n 1 個數,分別為 a1 a2 an 1 1 ak 2000 ak 和 ak 1 代表第 k 個矩陣是個 ak x ak 1 形的。輸出 共兩行 第一行 m 為最優代價。注 測試用例中 m 值保證小於 2 31 第二行...
c 矩陣連乘的動態規劃演算法並輸出 矩陣連乘
問題描述 給定n個矩陣a1,a2,an,其中,ai與aj 1是可乘的,i 1,2,n l。你的任務是要確定矩陣連乘的運算次序,使計算這n個矩陣的連乘積a1a2 an時總的元素乘法次數達到最少。例如 3個矩陣a1,a2,a3,階分別為10 100 100 5 5 50,計算連乘積a1a2a3時按 a1...