这题Dp方程很容易想到,但是居然WA了一天,后来一个博客,才发现负数对最大值的影响。恍然大悟呀……
/*
* zoj_2626.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define N 52
#define hpmax(a,b) (a)>(b)?(a):(b)
#define hpmin(a,b) (a)<(b)?(a):(b)
#define MIN -1e50
#define MAX 1e50
/**
* [0]: max
* [1]: min, maybe negative
*/
long long dp[N][N][2], ans;
int ver[N];
char ope[N];
int n;
inline long long calculate( long long a, char oper, long long b )
{
if ( '+' == oper )
return ( a+b );
return ( a*b );
}
int main()
{
int i, j, k, len, kn, jn;
long long tmp;
while ( scanf("%d", &n ) != EOF && n ) {
for ( i = 0; i < n; ++ i ) {
scanf(" %c%d", &ope[i], &ver[i] );
}
for ( i = 0; i < n; ++ i )
dp[i][i][0] = dp[i][i][1] = ver[i];
ans = MIN;
for ( len = 1; len < n; ++ len ) { //lenght = len+1
for ( i = 0; i < n; ++ i ) {
j = i + len;
jn = j%n;
dp[i][jn][0] = MIN;
dp[i][jn][1] = MAX;
for ( k = i; k < j; ++ k ) {
kn = k%n;
tmp = calculate( dp[i][kn][0], ope[(k+1)%n], dp[(k+1)%n][jn][0] );
dp[i][jn][0] = hpmax( dp[i][jn][0], tmp );
dp[i][jn][1] = hpmin( dp[i][jn][1], tmp );
tmp = calculate( dp[i][kn][0], ope[(k+1)%n], dp[(k+1)%n][jn][1] );
dp[i][jn][0] = hpmax( dp[i][jn][0], tmp );
dp[i][jn][1] = hpmin( dp[i][jn][1], tmp );
tmp = calculate( dp[i][kn][1], ope[(k+1)%n], dp[(k+1)%n][jn][0] );
dp[i][jn][0] = hpmax( dp[i][jn][0], tmp );
dp[i][jn][1] = hpmin( dp[i][jn][1], tmp );
tmp = calculate( dp[i][kn][1], ope[(k+1)%n], dp[(k+1)%n][jn][1] );
dp[i][jn][0] = hpmax( dp[i][jn][0], tmp );
dp[i][jn][1] = hpmin( dp[i][jn][1], tmp );
}
if ( n-1 == len )
ans = hpmax( ans, dp[i][jn][0] );
}
}
printf("%lld\n", ans );
}
return 0;
}