#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 15;
const int INF = 1<<30;
int A[MAXN];
int n;
int d[MAXN][MAXN];
int s[MAXN][MAXN];
void dp()
{
for(int l=2; l<=n; l++) {
for(int i=1; i<=n-l+1; i++) {
int j = i+l-1;
int &cur = d[i][j];
cur = INF;
for(int k=i; k<j; k++) {
int temp = d[i][k] + d[k+1][j] + A[i-1]*A[k]*A[j];
if(cur > temp) {
cur = temp;
s[i][j] = k;
}
}
}
}
}
void print(int i, int j)
{
if(i == j) {
printf("A%d", i);
return;
}
int k = s[i][j];
printf("(");
print(i, k);
printf(" x ");
print(k+1, j);
printf(")");
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int C = 0;
int t;
while(scanf("%d", &n) == 1 && n!=0) {
for(int i=0; i<n-1; i++) {
scanf("%d", &A[i]);
scanf("%d", &t);
}
scanf("%d", &A[n-1]);
scanf("%d", &A[n]);
dp();
printf("Case %d: ", ++C);
print(1, n);
printf("\n");
}
}
UVa 348 - Optimal Array Multiplication Sequence
最新推荐文章于 2017-06-04 18:48:00 发布
