2019 GDUT Winter Personal Training Contest III (Div. 2) F. Flipping Game
题目见 :
http://codeforces.com/group/NVaJtLaLjS/contest/236618/problem/F
题目大意:
给出一串长度为n(1<=n<=100)的由0和1组成的数列,你可以将一个区间内部的0变成1,1变成0,使整个数列总和最大。
思路:
肯定要多翻转0,少翻转1,那么我们可以将所有的区间都试着翻一遍,看看翻后会增加多少,取最大的那一次。
一次优化:
可以使用前缀数组 f[i] 表示到第 i 位总共和,那么对于当前区间 l , r,就有 f[i-1]+f[n]-f[j]+j-i+1+f[i-1]-f[j]表示反转这段区间能够增加的值。
实现:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int f[103];
int i,j,n,sum=0;
int r;
scanf("%d",&n);
f[0]=0;
for (i=1;i<=n;i++)
{
scanf("%d",&r);
f[i]=f[i-1]+r;
}
for (i=1;i<=n;i++)
for (j=i;j<=n;j++)
sum=max(sum,f[i-1]+f[n]-f[j]+j-i+1+f[i-1]-f[j]);
printf("%d\n",sum);
return 0;
}