转移方程:
m[i,j]= 0 if i==j, min(m[i][k]+m[k+1][j]+p[i-1]p[k]p[j]) if i<j
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <limits.h>
using namespace std;
#define INF INT_MAX
const int maxn=15;
int s[maxn][maxn],m[maxn][maxn],p[maxn],n;
void print(int i,int j){
if(i>=j){
printf("A%d",i);
return;
}else{
printf("(");
print(i,s[i][j]);
printf(" x ");
print(s[i][j]+1,j);
printf(")");
}
}
int main(){
int cas=1;
while (scanf("%d",&n)&&n){
memset(s,0,sizeof(s));
for (int i=0;i<n;++i){
int trash;
scanf("%d %d",&p[i],&p[i+1]);
}
for (int i=0;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=l+i-1;
m[i][j]=INF;
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;
}
}
}
}
printf("Case %d: ",cas++);
print(1,n);
printf("\n");
}
return 0;
}