C 動態規劃 矩陣鏈乘

2021-06-22 08:15:33 字數 1226 閱讀 5955



【c++】 動態規劃—矩陣鏈乘

1、問題描述

給定n個矩陣構成的乙個鏈給定{a1,a2,…,an},其中i=1,2,...,n.矩陣ai的維數為pi-1*pi,如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。 

2、最優子結構

對乘積a1a2...an的任意加括號方法都會將序列在某個地方分成兩部分,也就是最後一次乘法計算的地方,我們將這個位置記為k,也就是說首先計算a1...ak和ak+1...an,然後再將這兩部分的結果相乘。

最優子結構如下:假設a1a2...an的乙個最優加括號把乘積在ak和ak+1間分開,則字首子鏈a1...ak的加括號方式必定為a1...ak的乙個最優加括號,字尾子鏈同理。

一開始並不知道k的確切位置,需要遍歷所有位置以保證找到合適的k來分割乘積。

3、狀態轉移方程

4、**實現

1 #include2

using

namespace

std;3//

p為矩陣鏈,p[0],p[1]代表第乙個矩陣,p[1],p[2]代表第二個矩陣,length為p的長度4//

所以如果有六個矩陣,length=7,m為儲存最優結果的二維矩陣,t為儲存選擇最優結果路線的5//

二維矩陣

6void matrixchainorder(int *p,int (*m)[10],int (*t)[10],int

length)715

//i代表矩陣鏈的長度,i=2表示有兩個矩陣相乘時如何劃分

16for(i=2;i<=n;i++)

1735}36

}37}38

}39void printanswer(int(*t)[10],int i,int

j)40

45else

465253}

54int

main()55;

57int m[10][10],t[10][10

];58 matrixchainorder(p,m,t,7

);59 matrixchainorder(p,m,t,7

);60 printanswer(t,1,6

);61 cout<

62return0;

63 }

矩陣鏈乘 動態規劃

普通矩陣相乘 define row a 2 define col a 2 define col b 3 void matrix mul int mata row a col a int matb 2 col b int c row a col b 兩個相容矩陣相乘,相容是指矩陣a的行必須等於矩陣b的...

最優矩陣鏈乘 動態規劃

給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。解答 我們按照動態規劃的幾個步驟來分析 1 找出最優解的性質,刻畫其特徵結構 對於矩陣連乘問題,最優解就是找到一種計算順序,使得計算次數最少...

動態規劃經典問題 矩陣鏈乘

問題描述 給定n個矩陣,其中ai與ai 1是可乘的,i 1,2,3.n 1.考慮這n個矩陣的乘積。由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算機次序。這種計算次序可以用加括號的方式確定。若乙個矩陣鏈乘的計算次序完全確定,這時就說該鏈乘已完全加括號。完全加括號的矩陣鏈乘可遞迴的定義如...