演算法設計 矩陣連乘問題

2022-10-10 13:51:11 字數 2853 閱讀 4984

白天什麼也沒學,晚上才終於拿著筆,對著**,寫寫畫畫,終於看明白是怎麼計算的了。

以這6個矩陣連乘作為例子

a1a2

a3a4

a5a6

30*35

35*15

15*5

5*10

10*20

20*25

1 首先,要明白兩個矩陣相乘所需要做的乘法次數:

2 由於連乘的矩陣必須滿足,前乙個矩陣的列數=後乙個矩陣的行數,所以可以使用乙個陣列來儲存連乘矩陣的行列數:

p[7]=;

3 分析最優解的結構:

a[i:j]表示矩陣i到矩陣j的連乘,那麼a[i:j]=a[i:k]+a[k+1:j]+p[i-1]*p[k]*p[j](這兩個矩陣相乘所需的乘法次數);

如果a[i:j]的所需要的乘法次數是最少的,那麼a[i:k]和a[k+1:j]所需要的乘法次數也應該是最少的,否則a[i:j]就不是最優的,所以滿足最優子結構性質;

4 建立遞迴關係:

m[i][j]表示矩陣i連乘到矩陣j的最少乘次數,那麼原問題的最優值是m[1,n];

當i=j時,為單個矩陣,m[i][i]=0;

當i獲得以下遞迴定義: 

m[i][j]=0;    i=j

m[i][j]=mini<=k;  i如果需要得出最優解的加括號結果,需要另乙個二維陣列s[i][j],用於記錄使m[i][j]獲得最優解的斷點,k值;

5 分析**

1

int m[8][8]=,s[8][8]=;23

void maxtrixchain(int *p,int

n)17}18

}19 }

書上寫了「依據其遞迴式自底向上的方式進行計算」,沒拿出筆畫之前,我真的沒看懂這句話到底是怎麼自底向上的,於是我要開始寫寫畫畫了;

我們先暫時只看下面這部分**:

具體用資料分析一下

把右圖補充完整,將得到以下結果:這是我理解的自底向上地計算;

接下來看另一部分**:

所以我們需要把這兩部分**結合起來使用:

那麼對於m[1][4]我們是列舉了所有加括號的可能情況,並儲存了其中最小的乙個,獲得了最優值;

那麼對於m[2][5]、m[3][6]也能得到最優值;並且沒有做任何重複計算;

當r=5時,m[1][5]、m[2][6]也能得到最優值;

當r=6時,m]1][6]也能得到最優值;如此就得到了原問題的最優解;

每一次得到更小值的時候,s[i][j]=k,記錄(更新)這個斷點情況;最後可以用來幫助構造最優解的加括號形式;

6 以下給出完整源**:

1 #include2

using

namespace

std;34

//矩陣連乘:完全加括號問題5//

a1(p1*p2),a2(p2*p3),兩個矩陣相乘,總乘法次數為p1*p2*p3,其中p2表示結果的每個元素所需要的乘法次數6//

m[i][j]表示,第i個矩陣到第j個矩陣的連乘,所需要的乘法次數7//

對於多個矩陣連乘,可以得出以下遞推式8//

m[i][j]=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]9//

問題是如何找到這個k,使乘法次數最少

10int m[7][7]=; //

m[i][j]用於儲存,第i個矩陣連乘到第j個矩陣的乘法次數,那麼m[1][n]為最終結果

11int s[7][7]=; //

s[i][j]用於儲存,矩陣i和矩陣j之間所取的斷點,k值,用於構造結果的加括號情況

1213

void matrixchain(int n,int

p)31}32

33}34}

35}3637

//利用s[i][j]進行構造連乘的加括號情況

38void traceback(int i,int

j)45

46int

main();

48int n=6;49

matrixchain(n,arr);

50 traceback(1

,n);

51 cout<1][n]<

52 system("

pause");

53return0;

54 }

哇本渣終於弄清楚矩陣連乘了!!

演算法設計與分析 矩陣連乘順序問題

define n 50 include include class matrix 建構函式,作變數初始化工作,為指標分配記憶體空間 matrix matrix p new int n 析構函式,釋放記憶體 matrix matrix delete m delete s delete p 處理鍵盤輸入...

矩陣連乘問題

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

矩陣連乘問題

由於矩陣的乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這中計算次序 可以用加括號的方式來確定。例如,矩陣連乘積a1a2a3a4可以有5種不同的完全加括號方式 a1 a2 a3a4 a1 a2a3 a4 a1a2 a3a4 a1 a2a3 a4 a1a2 a3 a4 矩陣a和b可乘的條...