您的位置:首页 > 编程语言 > Go语言

zoj 2626 Polygon Game

2012-12-15 16:28 239 查看
这题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

[2], ans;
int	ver
;
char ope
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: