Kadane Algorithm
求一个数组里连续子序列的和最大。
for(int i=1;i<=n;i++) { nmax+=a[i]; maxx=max(maxx,nmax); nmax=max(nmax,0); }
A. Flipping Game
Description
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 akfor 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.
Examples
Input
5
1 0 0 1 0
Output
4
正确解法:
一直在想O(n)怎么写
题目是说 把一个子序列翻转,求最大1的个数。
我们把1的收益为 -1,0的收益为 1
![](/qrcode.jpg)
求一个序列的最大收益,也就是求这个序列的最大子序列和
最大收益加上原本1的个数就是答案了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 3000000+10; 5 const ll inf = 1e17; 6 int n; 7 int a[150],yi,maxx=-999999,nmax; 8 int main() 9 { 10 scanf("%d",&n); 11 for(int i=1;i<=n;i++) 12 { 13 scanf("%d",&a[i]); 14 if(a[i]==1) 15 { 16 yi++; 17 a[i]=-1; 18 } 19 else 20 a[i]=1; 21 } 22 for(int i=1;i<=n;i++) 23 { 24 nmax+=a[i]; 25 maxx=max(maxx,nmax); 26 nmax=max(nmax,0); 27 } 28 printf("%d\n",maxx+yi); 29 30 return 0; 31 }