給定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_
aiai+
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 ...