矩陣連乘問題

2021-06-22 18:38:50 字數 2141 閱讀 4625

由於矩陣的乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這中計算次序

可以用加括號的方式來確定。例如,矩陣連乘積a1a2a3a4可以有5種不同的完全加括號方式:

(a1(a2(a3a4)))

(a1((a2a3)a4))

((a1a2)(a3a4))

((a1(a2a3))a4)

(((a1a2)a3)a4)

矩陣a和b可乘的條件是矩陣a的列數等於矩陣b的行數。若a是乙個p*q的矩陣,

b是乙個q*r的

矩陣,其乘機c=ab是乙個p*r的矩陣,總共需要pqr次數乘。    

為了說明在計算矩陣連乘積

時,加括號方式對整個計算量的影響,我們考察計算3個矩陣a1a2a3的連乘積的例子。

這3個矩陣的尺寸分別為10*100,100*5和5*50。

若以((a1a2)a3)這種方式計算,

3個矩陣的連乘積需要的數乘次數為7500。

若以(a1(a2a3))這種方式計算,

所需的數乘次數為75000。顯然,在即算矩陣連乘積時,加括號方式對計算量有很大影響。

1.分析最優解的結構

設計求解具體問題的動態規劃演算法的第一步是刻畫該問題的最優解的結構特徵。我們將矩

陣連乘積aiai+1....aj簡記為a[ i : j ]。考察計算a[ 1: n]的最優計算次序。設這個計算

次序在矩陣ak和ak+1之間將矩陣鏈斷開,1<=k2.建立遞迴關係

設計動態規劃演算法的第二步就是遞迴地定義最優值。對於矩陣連乘積的最有計算次序問題

,設計算a[ i : j ], 1<=i<=j<=n,所需的最少數乘次數為m[ i ][ j ],則原問題的最優

值為m[ 1 ][ n]。    當i=j 時,a[ i  ; j ]=ai,為單一矩陣,無需計算,因此m[ i ][ i ]=0。

當i < j 時,可以利用最優子結構的性質來計算m[ i ][ j ]。事實上,若計算a[ i : j 

]的最優次序在ak和ak+1之間斷開,i<=k而m[ i ][ j ]可以遞迴地定義為

當i=j   m[ i ][ j ] = 0

當i3.計算最優值

根據計算m[ i ][ j ]的遞迴式,容易寫乙個遞迴演算法計算m[ 1 ][ n ]。但是簡單地遞

歸將好費指數計算時間。在遞迴計算時,許多子問題被重複計算多次。這也是該問題可以用動

態規劃演算法求解的又一顯著特徵。

用動態規劃演算法解決此問題,可依據其遞迴是以自底向上的方式進行計算。在計算的過程

中,儲存以解決的子問題答案。每個子問題只計算一次,而在後面需要時只要簡單查一下,從

而避免大量的重複計算。

#includeusing namespace std;

const int len = 50;

int p[len]; //p用來記錄矩陣的行列,main函式中有說明

int m[len][len]; //m[i][j]用來記錄第i個矩陣至第j個矩陣的最優解

int s[len][len]; //s[i][j]: 從i到j的連乘子串,從s[i][j]位置處斷開能得到最優解

int n;//矩陣個數

void matrixchain(){

for(int i=1;i<=n;i++)//連乘長度為1時保證為0,此為邊界條件。

m[i][i]=0;

for(int r=2;r<=n;r++)//連乘長度

for(int i=1;i<=n-r+1;i++){//行迴圈

int j = r+i-1;//列的控制:m[i][j]表示長度為r的連乘對,顯然連乘長度從2到n。

//找m[i][j]的最小值,首先假設最優解為從i節點斷開

m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];

s[i][j]=i;

//k表示斷開位置,從[i+1,j),迴圈找m[i][j]的最小值

for(int k = i+1;k>n;

cout<<"輸入矩陣a1維數"<<":";

cin>>p[0]>>p[1];

for(int i=2 ; i<=n ; i++){

int t = p[i-1];

cout<<"輸入矩陣a"<>p[i-1]>>p[i];

if(p[i-1] != t){

cout<

矩陣連乘問題

矩陣連乘問題 應用動態規劃演算法,將前面計算的重複值儲存,一次來推進下一步的計算,直到得到m 1 n 的值,為最少的乘法次數 m i j 表示計算a i.j 所需的最少數乘次數 m i j min i s i j 記錄斷開位置,也就是最少計算次數的中間位置。include using namespa...

矩陣連乘問題

矩陣連乘問題 問題分析 最優子結構性質假設n個矩陣連乘的最優加括號方案為 a1.ak ak 1.an 注 此處省略了a1.ak,ak 1.an兩個子矩陣內部的括號 則加括號方案 a1.ak 是子矩陣鏈a1.ak的最優加括號方案,ak 1.an 是ak 1.an的最優加括號方案。證明略。但可證明該假設...

矩陣連乘問題

題目描述 給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。例如 a1 a2 a3 a4 a5 a6 最後的結果為 a1 a2a3 a4a5 a6 最小的乘次為15125。解題思路 能用動態...