#include #include int i, j, k, nnum, nop ; char c ; unsigned long long nn, imin, imax, minresult[101][101], maxresult[101][101] ; // result[i][j] = x{i} * x_{i+1} * ... x_{i + j - 1} char op[101] ; unsigned long long min(unsigned long long x, unsigned long long y) { return (x < y ? x : y) ; } unsigned long long max(unsigned long long x, unsigned long long y) { return (x > y ? x : y) ; } int main() { nnum = nop = 0 ; while (1) { nnum = nop = 0 ; while ((c = getchar()) != '\n' && c != 'E') { if (c != '+' && c != '*') { nn *= 10 ; nn += (c - '0') ; } else { minresult[nnum][1] = nn ; maxresult[nnum++][1] = nn ; nn = 0 ; op[nop++] = c ; } } if (c == 'E') break ; minresult[nnum][1] = nn ; maxresult[nnum++][1] = nn ; /* printf("%d\n", nnum) ; for (i = 0 ; i < nnum ; i++) { printf("%llu ", minresult[i][1]) ; } printf("\n") ; for (i = 0 ; i < nop ; i++) { printf("%c ", op[i]) ; } */ nn = 0 ; for (i = 2 ; i <= nnum ; i++) { for (j = 0 ; j <= nnum - i ; j++) { imin = 9223372036854775807ULL ; imax = 0 ; for (k = 1 ; k < i ; k++) { if (op[j + k - 1] == '+') { imin = min(imin, minresult[j][k] + minresult[j + k][i - k]) ; imax = max(imax, maxresult[j][k] + maxresult[j + k][i - k]) ; } else { imin = min(imin, minresult[j][k] * minresult[j + k][i - k]) ; imax = max(imax, maxresult[j][k] * maxresult[j + k][i - k]) ; } /* printf("k = %d - min[%d][%d] = %llu\n", k, j, i, imin) ; printf("k = %d - max[%d][%d] = %llu\n", k, j, i, imax) ; */ } minresult[j][i] = imin ; maxresult[j][i] = imax ; /* printf("min[%d][%d] = %llu\n", j, i, imin) ; printf("max[%d][%d] = %llu\n", j, i, imax) ; */ } } printf("%llu %llu\n", minresult[0][nnum], maxresult[0][nnum]) ; } return 0 ; }