矩阵乘法链的dp问题。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <limits>
#include <cmath>
using namespace std;
const int size = 10 + 5;
int c[size][2];
int d[size][size] , f[size][size];
int dp(int x , int y)
{
if(d[x][y] >= 0) return d[x][y];
int m = numeric_limits<int>::max();
for(int i = x+1 ; i < y ; ++i)
{
int r = dp(x , i) + dp(i , y) + c[x][0] * c[i][0] * c[y-1][1];
if(r < m) {f[x][y] = i; m = r; }
}
return d[x][y] = m;
}
void output(int x , int y)
{
if(y-x < 2) { printf("A%d" , x + 1); return; }
int t = f[x][y];
printf("(");
output(x , t); printf(" x ");
output(t , y);
printf(")");
}
int main()
{
int n , cnt = 0;
while(scanf("%d" , &n) == 1 && n)
{
for(int i = 0 ; i < n ; ++i)
scanf("%d%d" , c[i] , c[i] + 1);
memset(d , -1 , sizeof(d));
memset(f , -1 , sizeof(f));
for(int i = 0 ; i < n ; ++i) d[i][i] = 0;
dp(0 , n);
printf("Case %d: " , ++cnt);
if(n == 1) printf("(A1)");
else output(0 , n);
printf("\n");
}
return 0;
}