假設矩陣a1:m*n , a2:n*p ,則a1*a1:m*p ,其中它們相乘的次數為:m*n*p。
矩陣連乘:多個矩陣相乘,它滿足結合律,故計算矩陣連乘有許多不同的計算次序,不同的計算次序也會導致計算量(數乘次數)的不同。例如:
有三個矩陣a1:10*20,a2:20*40,a3:40*30,則a1*a2*a3有兩種計算次序:
(一)、(a1*a2)*a3,則計算量(數乘次數)為 :10*20*40+10*40*30=20000.
(二)、a1*(a2*a3),則計算量(數乘次數)為:20*40*30+10*20*30=30000.
由此可見對於連乘的矩陣較多的情況,計算次序對計算量的影響很大。矩陣連乘要解決的問題就是,對於給定的合法連乘積a1*a2*…*an,怎麼求出最小的計算量(最優值)以及滿足最優值的乘法次序(最優解)。
我們記ai*…*aj為a[i,j],記第i個矩陣的維數為pi-1*pi。則如果a[1,n]即(整個矩陣連乘積)的計算次序最優,那麼a[1,k]和a[k+1,n]的計算次序也是最優的。即具有最優子結構性質。
記m[i][j]為計算a[i,j]所需要的最小計算量,則原問題最優解為m[1][n],由此寫出狀態轉移方程:
m[i][j]=min(m[i][k]+m[k+1][j]+pi-1*pk*pj).其中 i <= k < j。且邊界為i=j時 m[i][j]=0.(此時為單個矩陣計算量為0)。
**:
#include
using
namespace
std;
const
int n=10;
int p[7]=;
//p[0]:第乙個矩陣的行數
//p[1]:第乙個矩陣的列數,第二個矩陣的行數
//p[2]:第二個矩陣的列數,第三個矩陣的行數 .......
int m[n][n];
int s[n][n];//s[i][j]表示以i為其實位置,j為終止位置的最優計算量的括號位置
void matrixchain(int n)
for(int r=2;r<=n;r++)} }
} }void traceback(int i,int j)
else
}cout
<1][6]<1,6);
return
0;
}
動態規劃之矩陣連乘
以下內容參考 摘抄 演算法設計與分析 王曉東編著,清華大學出版社2003年1月第1版。給定n個矩陣,其中ai與ai 1是可乘的,i 1,2,n 1。考察這n個矩陣的連乘積a1a2 an。由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序,這種計算次序可以用加括號的方式來確定。若乙個矩...
動態規劃之矩陣連乘
題目描述 給定n個矩陣 a1,a2,an 其中,ai與ai 1是可乘的,i 1,2 n 1 用加括號的方法表示矩陣連乘的次序,不同的計算次序計算量 乘法次數 是不同的,找出一種加括號的方法,使得矩陣連乘的次數最小。例如 a1是a 5 10 的方陣 a2是a 10 100 的方陣 a3是a 100 2...
矩陣連乘(動態規劃)
題目描述 給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。例如 a1 a2 a3 a4 a5 a6 最後的結果為 a1 a2a3 a4a5 a6 最小的乘次為15125。思路 動態規劃演算...