//动态规划法
//矩阵链乘法问题
#include <iostream>
#include <limits.h>
using namespace std;
int p[1000];
int m[1000][1000],s[1000][1000];
void SEARCH(int s[][1000],int start,int end)
{
if(start > end) {cout << "wrong" <<endl; return ;}
if(start == end) {cout << "A" << start ; return ;}
if(start == (end-1)) {cout << "A" << start <<" " << "A" << end ; return ;}
else
{
cout << "(";
SEARCH(s,start,s[start][end]);
cout << ")(";
SEARCH(s,s[start][end]+1,end);
cout << ")";
return ;
}
}
void MATRIX_CHAIN(int n)
{
for(int i=1;i<=n;i++) m[i][i]=0;
for(int l=2;l<=n;l++)
{
for(int i=1;i<=n-l+1;i++)
{
int j=i+l-1;
m[i][j] = INT_MAX;
for(int k=i;k<=j-1;k++)
{
if(m[i][j] > (m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]))
{
m[i][j]=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
s[i][j]=k;
}
}
}
}
}
int main(int argc, char *argv[])
{
int n; cin >> n;
for(int i=0;i<=n;i++) cin >> p[i];
MATRIX_CHAIN(n);
cout << m[1][n] << endl;
cout << n << endl;
SEARCH(s,1,n);
return 0;
}
矩阵链乘法(动态规划法)
最新推荐文章于 2023-02-09 08:00:00 发布