题目描述
使用动态规划算法求解矩阵连乘问题。
输入
每组数据包括两行,第一行为数组长度n,第二行为存储矩阵维数的一维数组。
输出
矩阵连乘最优计算次序。
样例输入 Copy
7
30 35 15 5 10 20 25
样例输出 Copy
A[2:2] * A[3:3]
A[1:1] * A[2:3]
A[4:4] * A[5:5]
A[4:5] * A[6:6]
A[1:3] * A[4:6]
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
void matr(int n,int *p,int **m,int **s){
for(int i=1;i<=n;i++) m[i][i]=0;
for(int r=2;r<=n;r++){
for(int i=1;i<=n-r+1;i++){
int j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int k=i+1;k<j;k++){
int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t<m[i][j]){
m[i][j]=t;
s[i][j]=k;
}
}
}
}
}
void best(int **s,int i,int j){
if(i==j) return;
best(s,i,s[i][j]);
best(s,s[i][j]+1,j);
cout<<"A["<<i<<":"<<s[i][j]<<"]"<<" * "<<"A["<<s[i][j]+1<<":"<<j<<"]"<<endl;
}
int main(){
int n;
int *arrx,**arry,**arrz;
while(cin>>n){
arrx = (int*)malloc(n*sizeof(int));
arry = (int**)malloc((n+1)*sizeof(int*));
arrz = (int**)malloc((n+1)*sizeof(int*));
for(int i=0;i<=n;i++){
arry[i]=(int*)malloc((n+1)*sizeof(int));
arrz[i]=(int*)malloc((n+1)*sizeof(int));
}
for(int i=0;i<n;i++){
cin>>arrx[i];
}
matr(n,arrx,arry,arrz);
best(arrz,1,n-1);
}
}