矩陣連乘積

2021-09-19 19:04:41 字數 2324 閱讀 6340

\times

×n矩陣a與n×

\times

×p矩陣b相乘需消耗o(mnp)的時間。我們把mnp作為兩個矩陣用來相乘所需時間的測量值。

在多個矩陣連乘的情況下,不同矩陣之間的計算順序不同結果雖然相同,但總共所需要的乘法數量不同。

例子:a ===(

2561

43

)\bigl(\begin 2 & 5 & 6\\ 1 & 4 & 3 \end \bigr)

(21​54

​63​

),b ===[

[264

275]

]\bigl[ \begin2 & 6\\4 & 2\\ 7 & 5\end \bigr]

[⎣⎡​24

7​62

5​⎦⎤

​],c ===(

1568

3321

)\bigl(\begin 1 & 5 & 6 & 8\\ 3 & 3 & 2 &1\end \bigr)

(13​53

​62​

81​)

。計算abc的乘法次數。

方法一:(ab)c =

== 2×

\times

× 3×

\times

× 2 +

++ 2×

\times

× 2×

\times

× 4 =

== 28

方法二:a(bc) =

== 2×

\times

× 3×

\times

× 4 +

++ 3×

\times

× 2×

\times

× 4 =

== 48

**注:此處細節略過,學過線性代數的小夥伴應該都知道的。

我們定義a[i,j](1≤

\leq

≤ i ≤

\leq

≤ j ≤

\le≤ n)所需要的最少次數為m[i][j],則原問題的最優解是m[1][n]。

狀態轉移方程為:

m [i

][j]

=0 & i = j \\ \min\limits_ p_kp_j} & i m[

i][j

]=⎩⎨

⎧​0i

≤k<

jmin​m

[i][

k]+m

[k+1

][j]

+pi−

1​pk

​pj​

​i=j

i

#include

#define num 51

int p[num]

;//記錄矩陣ai的維數

int m[num]

[num]

;//記錄最優值陣列

int s[num]

[num]

;//記錄最優斷開位置的陣列s

void

matrixchain

(int n)

//計算最優值 }}

}void

traceback

(int i,

int j)

//構造最優解結構(遞迴)

}int

main()

都說動態規劃其實質就是乙個填表的過程,**的兩層填表過程如下圖所示:

d= 1

d = 2

d = 3

d = 4

d = 5

d = 6

m[1,1]

m[1,2]

m[1,3]

m[1,4]

m[1,5]

m[1,6]

m[2,2]

m[2,3]

m[2,4]

m[2,5]

m[2,6]

m3,3]

m[3,4]

m[3,5]

m[3,6]

m[4,4]

m[4,5]

m[4,6]

m[5,5]

m[5,6]

m[6,6]

6

50 10

10 40

40 30

30 5

5 20

20 15

15750

((a1(a2(a3a4)))(a5a6))

怎麼講呢,學到了很多markdown公式的寫法,而矩陣連乘積正是動態規劃的乙個經典例子。學好動態是演算法的乙個深化吧!

計算矩陣連乘積

描述 在科學計算中經常要計算矩陣的乘積。矩陣a和b可乘的條件是矩陣a的列數等於矩陣b的行數。若a是乙個p q的矩陣,b是乙個q r的矩陣,則其乘積c ab是乙個p r的矩陣。計算c ab總共需要p q r次乘法。現在的問題是,給定n個矩陣。其中ai與ai 1是可乘的,i 1,2,n 1。要求計算出這...

計算矩陣連乘積

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述在科學計算中經常要計算矩陣的乘積。矩陣a和b可乘的條件是矩陣a的列數等於矩陣b的行數。若a是乙個p q的矩陣,b是乙個q r的矩陣,則其乘積c ab是乙個p r的矩陣。計算c ab總共需要p q r次乘法。現在的問題是,給定n個...

計算矩陣連乘積

在科學計算中經常要計算矩陣的乘積。矩陣a和b可乘的條件是矩陣a的列數等於矩陣b的行數。若a是乙個p q的矩陣,b是乙個q r的矩陣,則其乘積c ab是乙個p r的矩陣。由該公式知計算c ab總共需要pqr次的數乘。其標準計算公式為 現在的問題是,給定n個矩陣。其中ai與ai 1是可乘的,i 1,2,...