矩阵相乘求最小运算次数。
经典的动规题目。
代码如下;
#include <cstdio>
#define N 20
#define INF 0x7fffffff
int n, a[N][2], d[N][N], pa[N][N];
void dp()
{
for(int i = 0; i < n; i++) d[i][i] = 0;
for(int len = 1; len < n; len++)
{
for(int s = 0; s < n-len; s++)
{
int min = INF, minx;
for(int k = s; k < s+len; k++)
{
int tt = d[s][k]+d[k+1][s+len]+a[s][0]*a[k][1]*a[s+len][1];
if(min>tt) {min = tt; minx = k;}
}
d[s][s+len] = min; pa[s][s+len] = minx;
}
}
}
void print_ans(int s, int e)
{
if(s==e)
{
printf("A%d",s+1);
return;
}
printf("(");
print_ans(s,pa[s][e]);
printf(" x ");
print_ans(pa[s][e]+1,e);
printf(")");
}
int main ()
{
int cas = 0;
while(scanf("%d",&n), n)
{
for(int i = 0; i < n; i++) scanf("%d%d",&a[i][0], &a[i][1]);
dp();
printf("Case %d: ",++cas);
print_ans(0,n-1);
printf("\n");
}
return 0;
}