[ 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 ...