【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 #include2using
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個矩陣的乘積。由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算機次序。這種計算次序可以用加括號的方式確定。若乙個矩陣鏈乘的計算次序完全確定,這時就說該鏈乘已完全加括號。完全加括號的矩陣鏈乘可遞迴的定義如...