動態規劃 矩陣連乘問題

2021-09-13 10:35:43 字數 1920 閱讀 7549

[ description]

給定n個矩陣a1, a2,… an,其中,a;與aj+1是可乘的,i=1, 2, . n-1。確定矩陣連乘的運算次序,使計算這n個矩陣的連乘積a1a—an時總的元素乘法次數達到最少,例如,3個矩陣a1, a2, a3,階分別為10x100、100x5、 5x50,計算連乘積a.a.a.時按(a142) a3所需的元素乘法次數達到最少,為7500次。

[input]

有若干種案例,每種兩行,第一行是乙個非負整數n,表示矩陣的個數,n=0 表示結束。接著有n行,每行為兩個正整數,表示矩陣的維數。

[output]

對應輸出最小的乘法次數。

[sample input】

45 20

20 50

50 1

1 100

0[sample output】

1600

分析:

二.問題分析

由於矩陣乘法滿足結合律,所以計算矩陣連乘的連乘積可以與許多不同的計算計算次序,這種計算次序可以用加括號的方式來確定。若乙個矩陣連乘積的計算次序完全確定,也就是說連乘積已完全加括號,那麼可以依此次序反覆呼叫2個矩陣相乘的標準演算法計算出矩陣連乘積。

完全加括號的矩陣連乘積可遞迴地定義為:

(1).單個矩陣是完全加括號的;

(2).矩陣連乘積a是完全加括號的,則a可以表示為2個完全加括號的矩陣連乘積b和c的乘積並加括號,及a=(bc)

舉個例子,矩陣連乘積a1a2a3a4a5,可以有5種不同的完全加括號方式:

(a1(a2(a3a4))),(a1((a2a3)a4)),((a1a2)(a3a4)),((a1(a2a3))a4),(((a1a2)a3)a4)

每一種完全加括號的方式對應一種矩陣連乘積的計算次序,而矩陣連乘積的計算次序與其計算量有密切的關係,即與矩陣的行和列有關。

補充一下數學知識,矩陣a與矩陣b可乘的條件為矩陣a的列數等於矩陣b的行數,例如,若a是乙個pq的矩陣,b是乙個qr的矩陣,則其乘積c=ab是乙個p*r的矩陣。

原始碼如下:

#include

#include

using namespace std;

#define max 255

int a[max]

,m[max]

[max]

;int

getmin

(int i,

int j)

min=

getmin

(i,i)

+getmin

(i+1

,j)+a[i]

*a[i+1]

*a[j+1]

;for

(int k=i+

1;k) m[i]

[j]=min;

return min;

}int

main()

return1;

}

相關題目 poj1651

#include

#include

using namespace std;

int a[

255]

,m[255][

255]

,n;//陣列代表每個卡片的數字 另乙個代表矩陣相乘 n代表有幾張卡牌

intgetmin()

m[i]

[j]=min;}}

return m[1]

[n-1];

//計算了所有 返回想要的值

}int

main()

return1;

}

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

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 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 ...