描述:状态转移方程min(v,dp(x,i)+dp(i+1,y)+num[x][0]*num[i][1]*num[y][1]);数据量只有10,不大,主要是存储步骤
#include <cstdio>
#include <cstring>
int num[15][2],s[15][15],count[15][15];
int dp(int x,int y)
{
int &v=count[x][y];
if(v) return v;
for(int i=x; i<y; i++)
{
int t=dp(x,i)+dp(i+1,y)+num[x][0]*num[i][1]*num[y][1];
if(!v||t<v)
{
v=t;
s[x][y]=i;
}
}
return v;
}
void show(int x,int y)
{
if(x==y) printf("A%d",x+1);
else
{
printf("(");
show(x,s[x][y]);
printf(" x ");
show(s[x][y]+1,y);
printf(")");
}
}
int main()
{
int n,m=1;
//freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
for(int i=0; i<n; i++) scanf("%d %d",&num[i][0],&num[i][1]);
memset(s,-1,sizeof(s));
memset(count,0,sizeof(count));
printf("Case %d: ",m++);
dp(0,n-1);
show(0,n-1);
printf("\n");
}
return 0;
}