您的位置:首页 > 其它

矩阵连乘(动态规划)

2018-10-14 17:08 351 查看

题目描述:

                  

递归方式:

[code]//递归方法
#include<iostream>
#include<cstdio>
using namespace std;

int p[100],s[100][100];

int DirectMatrixChain(int i,int j)//递归的求最优解u
{
if(i==j) return 0;
int u=DirectMatrixChain(i,i)+DirectMatrixChain(i+1,j)+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int k=i+1;k<j;k++)
{
int t=DirectMatrixChain(i,k)+DirectMatrixChain(k+1,j)+p[i-1]*p[k]*p[j];
if(t<u)
{
u=t;
s[i][j]=k;
}
}
return u;
}

void traceback(int i,int j)//递归输出矩阵连乘次序
{
if(i==j)
cout<<"A"<<i;
else if (i==j-1)
cout<<"(A"<<i<<"A"<<j<<")";
else
{
cout<<"(";
traceback(i,s[i][j]);
traceback(s[i][j]+1,j);
cout<<")";
}
}

int main()
{
int n;
cin>>n;
for(int i=0;i<=n;i++)
cin>>p[i];
cout<<DirectMatrixChain(1,n)<<endl;
traceback(1,n);
cout<<endl;
return 0;
}

[code]//递推方法
#include<iostream>
#include<cstdio>
using namespace std;

int p[1000],m[1000][1000],s[1000][1000];

void MatrixChain(int n)//递推求最优解
{        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 traceback(int i,int j)//递归输出矩阵连乘次序
{
if(i==j)
cout<<"A"<<i;
else if (i==j-1)
cout<<"(A"<<i<<"A"<<j<<")";
else
{
cout<<"(";
traceback(i,s[i][j]);
traceback(s[i][j]+1,j);
cout<<")";
}
}

int main()
{
int n;
cin>>n;
for(int i=0;i<=n;i++)
{
cin>>p[i];
}
MatrixChain(n);
traceback(1,n);
cout<<endl;
return 0;
}

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