演算法動態規劃問題之矩陣連乘

2021-07-11 06:59:42 字數 1175 閱讀 7878

給定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 可以有以...