/*
输入:矩阵个数n,n+1个矩阵列数
输出:最小矩阵链乘的加全括号方法
算法思想:动态规划,递归打印最优解
*/
#include <iostream>
using namespace std;
int m[100][100]; //m[i][j]为 Ai…j的最小标量乘法数
int s[100][100]; //切割点
int p[100]; //p[i]为Ai的列数,Ai+1的行数
int inf=0x7fff;
void matrix_chain_order(int p[],int n)
{
int i,j,k,l,q;
for(i=1;i<=n;i++)
m[i][i]=0; //Ai…i不需做乘法
for(l=1;l<=n-1;l++) //l=j-i,l+1为矩阵链长
for(i=1;i<=n-l;i++)
{
j=i+l;
m[i][j]=inf;
for(k=i;k<=j-1;k++) //找到最小矩阵链乘的切割点k
{
q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(m[i][j]>q)
{
m[i][j]=q;
s[i][j]=k;
}
}
}
}
void print_optimal_chain(int s[][100],int i,int j) //根据切割点递归构造一个最优解
{
if(i==j)
cout <<"A" <<i;
else
{
cout <<"(";
print_optimal_chain(s,i,s[i][j]);
print_optimal_chain(s,s[i][j]+1,j);
cout <<")";
}
}
int main()
{
int n,i;
cin >>n;
for(i=0;i<=n;i++)
cin >>p[i];
matrix_chain_order(p,n);
print_optimal_chain(s,1,n);
return 0;
}
最小矩阵链乘
最新推荐文章于 2021-04-27 20:27:45 发布