zoj 2626 Polygon Game

    这题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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值