dp矩阵链乘 不解释。最优子结构为最后一个乘号两边的一定也是最优子问题解
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 15
using namespace std;
int dp[MAX][MAX],father[MAX][MAX],s[MAX+2];
void print(int front,int rear)
{
if(rear-front==1)
{
printf("A%d",front);
return ;
}
printf("(");
print(front,father[front][rear]);
printf(" x ");
print(father[front][rear],rear);
printf(")");
return ;
}
int main()
{
int n,i,j,t,cases=1;;
while(scanf("%d",&n)&&n)
{
scanf("%d",&s[1]);
for(i=2;i<=n;i++)
{
scanf("%d",&s[i]);
scanf("%d",&s[i]);
}
scanf("%d",&s[i]);
memset(dp,0,MAX*MAX*4);
memset(father,0,MAX*MAX*4);
for(i=2;i<=n;i++)
{
for(j=1;j<=n-i+1;j++)
{
for(t=j+1;t<j+i;t++)
{
if(dp[j][j+i]==0)
{
dp[j][j+i]=dp[j][t]+dp[t][j+i]+s[j]*s[t]*s[j+i];
father[j][j+i]=t;
}
else
{
if(dp[j][j+i]>dp[j][t]+dp[t][j+i]+s[j]*s[t]*s[j+i])
{
dp[j][j+i]=dp[j][t]+dp[t][j+i]+s[j]*s[t]*s[j+i];
father[j][j+i]=t;
}
}
}
}
}
printf("Case %d: ",cases++);
print(1,n+1);
printf("\n");
}
return 0;
}