您的位置:首页 > 其它

动态规划解决矩阵连乘

2011-12-12 19:16 267 查看
#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]
;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: