UVa 348 - Optimal Array Multiplication Sequence

来源:互联网 发布:果园系统源码 编辑:程序博客网 时间:2024/05/01 14:17
#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");    }}