白天什麼也沒學,晚上才終於拿著筆,對著**,寫寫畫畫,終於看明白是怎麼計算的了。
以這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可乘的條...