動態規劃 矩陣鏈相乘

2021-10-05 04:54:30 字數 1658 閱讀 5764

設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...