m×
\times
×n矩陣a與n×
\times
×p矩陣b相乘需消耗o(mnp)的時間。我們把mnp作為兩個矩陣用來相乘所需時間的測量值。
在多個矩陣連乘的情況下,不同矩陣之間的計算順序不同結果雖然相同,但總共所需要的乘法數量不同。
例子:a ===(
2561
43
)\bigl(\begin 2 & 5 & 6\\ 1 & 4 & 3 \end \bigr)
(2154
63
),b ===[
[264
275]
]\bigl[ \begin2 & 6\\4 & 2\\ 7 & 5\end \bigr]
[⎣⎡24
762
5⎦⎤
],c ===(
1568
3321
)\bigl(\begin 1 & 5 & 6 & 8\\ 3 & 3 & 2 &1\end \bigr)
(1353
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<
jminm
[i][
k]+m
[k+1
][j]
+pi−
1pk
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,...