給定n個矩陣,考察通過加括號,這n個矩陣相乘的最少需要多少次乘法
假設有六個矩陣連乘,如下
a1 a2 a3 a4 a5 a6
30*35 35*15 15*5 5*10 10*20 20*25
想要求得這六個矩陣相乘的最優解,可以使用動態規劃的方法解決。動態規劃是指將待求解問題分解成若干個子問題,先求得子問題,然後從這些子問題的解得到原問題的解。
步驟如下:
①分析最優解結構,建立遞迴關係 ②計算最優值 ③構造最優解
源程式:
#include
using namespace std;
void matrixchain(int **a,int**b,int* c,int n)
for(int r=2;rfor(int i=1;iint j=i+r-1;
//a[i][j]=a[i+1][j]+c[i-1]*c[i]*c[j];
//b[i][j]=i;
for(int k=i;kint t=a[i][k]+a[k+1][j]+c[i-1]*c[k]*c[j];
if(t}}}
//cout/cout
traceback(i,s[i][j],s);
traceback(s[i][j]+1,j,s);
cout<
int c[7]=;
//int a=;
//int c[5]=;
int n=7;
int ** a = new int *[n];
for(int i = 0;i < n;i++)
a[i] = new int[n];
int ** b = new int *[n];
for(int i = 0;i < n;i++)
b[i] = new int[n];
matrixchain(a,b,c,n);
traceback(1,6,b);
cout
}
動態規劃之矩陣連乘問題
在動態規劃演算法中,區域性最優並不一定會使得全域性最優,它在每乙個階段的決策都會影響到後面的決策。所以我們在將問題劃分為若干階段時,需要將各個階段所發生的不同狀態儲存起來,提供後一階段做決策。一般都是子問題重疊的時候使用動態規劃。下面是乙個矩陣連乘的問題。問題 n個矩陣連乘問題 描述 矩陣連乘滿足結...
動態規劃之矩陣連乘問題
矩陣連乘問題是通過給矩陣連乘時加括號,使得總的計算量最小。考慮3個矩陣相乘的例子,a1,a2,a3,假設這3個矩陣的維數分別為 10x100,100x50,5x50 若按照 a1a2 a3 方式計算,需要的數乘次數為10x100x5 10x5x50 7500 若按照 a1 a2a3 方式計算,需要的...
動態規劃之矩陣連乘問題
給定 n 個矩陣 其中 a i 與 a 是可乘的 i 1,2,ldots,n 1 矩陣 a i 的維數為 p p i,i 1,2,ldots,n 考察這 n 個矩陣的連乘積 a 1a 2 ldots a n 要求通過新增括號使得矩陣連乘時,數乘次數最少。例如連乘積 a 1a 2a 3a 4 可以有以...