/* 1996 ACM North Central Regional Programming Contest Problem D -- Optimal Array Multiplication Sequence Ed Karrels, November 1996 */ #include #include typedef struct { int rows, cols; } Dims; typedef struct Factor { struct Factor *left, *right; int me; } Factor; int case_no = 0; void Print(int combine[], int n); void BestMult(Dims dims[], int n, int lvl, long nmult, int best_combine[]) { static int *combine; static long best_nmult; Dims *my_dims; int i, j; long my_nmult; if (lvl == 0) { best_nmult = -1; combine = (int*)malloc(sizeof(int) * (n-1)); } if (n == 1) { /* printf("%ld ", nmult); Print(combine, lvl+1); */ if (best_nmult == -1 || nmult < best_nmult) { for (i=0; ileft) { putchar('('); PrintFact(f->left); printf(" x "); PrintFact(f->right); putchar(')'); } else { printf("A%d", f->me); } } void FreeFact(Factor *f) { if (f) { FreeFact(f->left); FreeFact(f->right); free((char*)f); } } void Print(int combine[], int n) { Factor **factors, *newf; int i, j; factors = (Factor**)malloc(sizeof(Factor*) * n); for (i=0; ileft = factors[i]->right = 0; factors[i]->me = i+1; } for (i=0; ileft = factors[combine[i]]; newf->right = factors[combine[i]+1]; factors[combine[i]] = newf; for (j=combine[i]+1; j