题目描述:

                  矩阵连乘(动态规划)

递归方式:

//递归方法 
#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;
}
 

矩阵连乘(动态规划)

//递推方法 
#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;
 }

矩阵连乘(动态规划)

相关文章: