設s1,a2,a3,…an為n個矩陣的序列,其中ai為pi-1×pi階矩陣,這個矩陣鏈的輸入用向量p=給出。
給定向量p,確定一種乘法次序,使得基本運算的總次數達到最小。
我才用的矩陣為
a1(30×35)、
a2(35×15)、
a3(15×5)、
a4(5×10)、
a5(10×20)、
a6(20×25),
那麼得到的p=<30,35,15,5,10,20,25>
設m[i,j]為計算機矩陣ai…j所需的標量乘法運算次數的最小值,對此計算a1…n的最小代價就是m[1,n]。現在需要來遞迴定義m[i,j],分兩種情況進行討論如下:
1)當i==j時:m[i,j] = 0,(此時只包含乙個矩陣)
2)當i,length[p] = n+1。使用m[n][n]儲存m[i,j]的代價,s[n][n]儲存計算m[i,j]時取得最優代價處k的值,最後可以用s中的記錄構造乙個最優解。
實現過程定義兩個二維陣列m和s,為了方便計算其第一行和第一列都忽略,行標和列標都是1開始。
#include
using
namespace std;
#define n 6
#define maxvalue 1000000
void
matrix_chain_order
(int
* p,
int len,
int m[n +1]
[n +1]
,int s[n +1]
[n +1]
);void
print_optimal_parents
(int s[n +1]
[n +1]
,int i,
int j)
;int
main()
;int m[n +1]
[n +1]
=;int s[n +1]
[n +1]
=;int i, j;
matrix_chain_order
(p, n +
1, m, s)
; cout <<
"最佳次序為:"
<< endl;
print_optimal_parents
(s,1
, n)
; cout << endl;
return0;
}void
matrix_chain_order
(int
* p,
int len,
int m[n +1]
[n +1]
,int s[n +1]
[n +1]
)}}}
}//s中存放著括號當前的位置
void
print_optimal_parents
(int s[n +1]
[n +1]
,int i,
int j)
}
matrix_chain_order函式具有迴圈巢狀,深度為3層,執行時間為o(n3)。
如果採用遞迴進行實現,則需要指數級時間ω(2n),因為中間有些重複計算。
動態規劃 矩陣鏈相乘
實驗題目3 矩陣鏈乘法 11.1日實驗 要求 1 設計暴力法,產生所有矩陣鏈相乘以組合情況,寫出 並除錯成功 2 設計動態規劃演算法,寫出 尋找最小乘法次數和對應相乘的順序,並除錯成功 3 隨機產生由10個矩陣,測試 2 的 輸出最小乘法次數和相乘的順序。from random import def...
動態規劃之矩陣鏈相乘
在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。問題描述 詳見演算法導論p197 p198 已知 給定n個矩陣構成的乙個矩陣鏈 a1,a2,an 矩陣ai的維數為pi 1 pi 求 決定該矩陣鏈的乘法結合順序 即加括號 使得矩陣鏈乘法的執行時間最短 ...
動態規劃之矩陣鏈相乘
題目 n個矩陣連乘,求最少的乘法運算次數以及結合方式 假設矩陣a為r1 r2,矩陣b為r2 r3,所以m a b r1 r2 r3。當有多個矩陣相乘的時候,矩陣以不同的方式結合的時候其運算次數是不同的。例如 m m1 m2 m3 m4 5 20 20 50 50 1 1 100 m1 m2 m3 m...