動態規劃 矩陣連乘問題

2021-10-07 13:34:48 字數 2359 閱讀 8658

給定n個矩陣,其中ai和ai+1是可乘的,要求確定矩陣連乘的計算次序,使得矩陣連乘需要的數乘次數最少。

先看兩個矩陣相乘:a

1a_1

a1​是p0∗

p1p_0*p_1

p0​∗p1

​的矩陣,a

2a_2

a2​是p1∗

p2p_1*p_2

p1​∗p2

​的矩陣,則a1∗

a2a_1*a_2

a1​∗a2

​是p0∗p

2p_0*p_2

p0​∗p2

​的矩陣,新矩陣中每乙個元素是由p

1p_1

p1​對數的乘積求和的得到的,即兩個矩陣相乘需要的數乘次數為p0∗

p2∗p

1p_0*p_2*p_1

p0​∗p2

​∗p1

​。為了方便起見,給出如下定義:

1)a i=

pi−1

∗pia_i=p_*p_i

ai​=pi

−1​∗

pi​,即ai−

1a_ai−1

​是乙個pi−

1p_pi−1​行p

ip_i

pi​列的矩陣。

2)a [i

:j]a[i:j]

a[i:j]

——矩陣連乘積aia

i+1…

aja_a_…a_

ai​ai+

1​…a

j​(a [i

:j]a[i:j]

a[i:j]

是乙個pi−

1∗pj

p_*p_j

pi−1​∗

pj​的矩陣)。

3 )用二維陣列m[i

][j]

m[i][j]

m[i][j

]記錄a[i

:j]a[i:j]

a[i:j]

的最優解。

動態規劃的思想就是保留最優子結構的解,然後由子結構的最優解逐步得到原來問題的解。m[i

][j]

m[i][j]

m[i][j

]就相當於乙個備忘錄,它記錄著子結構的最優解。

m[i

][j]

m[i][j]

m[i][j

]的遞推公式如下:

中的最小值

int i;

int min=min[0]

;for

(i=1

;i)return min;

}int

matrichain

(int n,

int p)

中的值以便於比較

int index=0;

//表示min陣列的下標

int i;

for(i=

1;i<=n;i++

) m[i]

[i]=0;

//m從(1,1)位置開始儲存,方便理解

int j;

//j為連乘矩陣的個數,控制問題規模

int k;

//k表示連乘矩陣中最左矩陣的序號(如a[2,4]=a2*a3*a4 ,j=3,k=2)

int mid;

//用於劃分a[i:j]

for(j=

2;j<=n;j++

) m[k]

[k+j-1]

=getmin

(min,j-1)

; index=0;

}}return m[1]

[n];

}int

main()

;//矩陣規模資訊,根據矩陣連乘的要求,需要用n+1個數儲存n個矩陣的規模資訊

int matri_num=

matrichain

(n,p)

;printf

("一共進行了%d次數乘"

,matri_num)

;return0;

}

矩陣連乘 動態規劃 動態規劃解矩陣連乘問題

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...

python矩陣連乘 動態規劃 矩陣連乘問題

一 問題描述 給定n個數字矩陣a1,a2,an,其中ai與ai 1是可乘的,設ai是pi 1 pi矩陣,i 1,2,n。求矩陣連乘a1a2.an的加括號方法,使得所用的乘次數最少。例子三個矩陣連乘,可以有 a1a2 a3和a1 a2a3 兩種方法求積 乘法次數分別為 p0p1p2 p0p2p3和p0...

動態規劃 矩陣連乘問題

給定n 1個矩陣 a0,a1,a2,an 1 其中ai與ai 1是可乘的,i 0,1,2,n 2。矩陣乘法滿足結合律。考察這n個矩陣的連乘積,得出運算次數最少的結合。首先,考慮兩個矩陣相乘。如果a b兩個矩陣可以相乘,那麼a b的形式必定滿足 a p q b q r 設c a b,那麼c滿足c p ...