您的位置:首页 > 其它

Flipping Game

2015-06-08 23:01 260 查看


Flipping Game

time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

Iahub got bored, so he invented a game to be played on paper.
He writes n integers a1, a2, ..., an.
Each of those integers can be either 0 or 1. He's allowed to do exactly one move: he chooses two indices i and j (1 ≤ i ≤ j ≤ n)
and flips all values ak for
which their positions are in range [i, j] (that
is i ≤ k ≤ j). Flip the
value of x means to apply operation x = 1 - x.
The goal of the game is that after exactly one move to obtain the maximum number of ones.
Write a program to solve the little game of Iahub.

Input
The first line of the input contains an integer n (1 ≤ n ≤ 100).
In the second line of the input there are n integers: a1, a2, ..., an.
It is guaranteed that each of those n values is either 0 or 1.

Output
Print an integer — the maximal number of 1s that can be obtained after exactly one move.

Sample test(s)

input
5
1 0 0 1 0


output
4


input
41 0 0 1


output
4


Note
In the first case, flip the segment from 2 to 5 (i = 2, j = 5).
That flip changes the sequence, it becomes: [1 1 1 0 1]. So, it contains four ones. There is no way to make the whole sequence equal to [1 1 1 1 1].
In the second case, flipping only the second and the third element (i = 2, j = 3) will
turn all numbers into 1.
一些01,改变一个区间,然后把这个区间内1变为0,0变为1,求变化后1的最大个数(必须修改一个数)。一个简单的动规,只需要判断这个数字能最大改变多少1的个数。
if(a[i]==0)dp[i]=max(0,dp[i-1]+1);
if(a[i]==1)dp[i]=max(0,dp[i-1]-1);
然后注意如果全是1的话,这个通项出来的是n,然而题目要求至少改变一个数,所以这个情况就是n-1。特判。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int dp[105], a[105];
int max(int a, int b)
{
	return a > b ? a : b;
}
int main()
{
	int n, i, j, m, ans, pre;
	cin >> n;
	pre = 0;
	for (i = 1; i <= n; i++)
	{
		cin >> a[i];
		if (a[i] == 1)pre++;
	}
	if (a[1] == 0)dp[1] = 1;
	else dp[1] = 0;
	for (i = 2; i <= n; i++)
	{
		if (a[i] == 1)
			dp[i] = max(dp[i - 1] - 1, 0);
		else if (a[i] == 0)
			dp[i] = max(0, dp[i - 1] + 1);
	}
	ans = dp[1];
	for (i = 2; i <= n; i++)
		ans = max(ans, dp[i]);
	if (ans == 0)
		cout << pre - 1 << endl;
	else
		cout << pre + ans << endl;

	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: