#include<iostream>
using namespace std;
#include<stdio.h>
/*p是一维数组,记录矩阵的规模(第一个矩阵的行和其余矩阵的列);
n是矩阵的个;m是二维数组,记录计算A[i:j],1<=i<=j<=n所需要的最少数乘次数m[i][j];
相对应于m[i][j]的断开位置k记为s[i][j]*/
void MatrixChain(int *p,int n,int **m,int **s){
for(int i = 1;i <= n;i++)
m[i][i] = 0;
for(int r = 2;r <= n;r++)
for(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 Traceback(int i,int j,int **s){
if(i == j)
{
cout<<"A"<<i;
return;
}
cout<<"(";
Traceback(i,s[i][j],s);
Traceback(s[i][j]+1,j,s);
cout<<")";
}
void main(){
int **s;
int **m;
int n;
int *p;
cout<<"输入矩阵个数:";
cin>>n;
p = (int*)malloc((n+1) * sizeof(int));
s = (int**)malloc((n+1) * sizeof(int*));
for(int i = 1;i <= n;i++)
s[i] = (int*)malloc((n+1) * sizeof(int));
m = (int**)malloc((n+1) * sizeof(int*));
for(i = 1;i <= n;i++)
m[i] = (int*)malloc((n+1) * sizeof(int));
cout<<"输入矩阵规模:(第一个的行数和其余矩阵的列数)";
for( i = 0;i <= n;i++)
cin>>p[i];
MatrixChain(p,n,m,s);
Traceback(1,n,s);
cout<<m[1][n];
}
动态规划解决矩阵连乘
最新推荐文章于 2025-01-02 16:41:34 发布