dp,经典问题了
注意乘号两边都有空格
#include <bits/stdc++.h>
using namespace std;
struct node
{
int l,r;
};
node m[15];
int n;
int d[15][15];
int r[15][15];
int dp(int i,int j)
{
if (d[i][j]>0) return d[i][j];
if (i==j) return 0;
int dd=1<<30;
for (int s=i;s<j;s++){
if (dd>dp(i,s)+dp(s+1,j)+m[i].l*m[s].r*m[j].r){
dd=d[i][s]+d[s+1][j]+m[i].l*m[s].r*m[j].r;
r[i][j]=s;
}
}
return d[i][j]=dd;
}
void print(int i,int j)
{
if (i==j){
printf("A");
printf("%d",i);
return ;
}
printf("(");
print(i,r[i][j]);
printf(" x ");
print(r[i][j]+1,j);
printf(")");
}
int main()
{
int num=1;
while(~scanf("%d",&n)&&n){
memset(d,0,sizeof(d));
for (int i=1;i<=n;i++){
scanf("%d%d",&m[i].l,&m[i].r);
}
dp(1,n);
printf("Case %d: ",num++);
print(1,n);
printf("\n");
}
return 0;
}