链接:http://codeforces.com/problemset/problem/327/A
题意:给一串数,只由0和1组成,在某个区间内,把1变成0,0变成1,再把所有数求和,求能达到的最大的和。
思路:暴力嘛,就一个区间一个区间的试咯。这样的话是O(n^3)的复杂度。如果预处理求出前 i 个数的和,可以降到O(n^2)。采用动态规划可以降到O(n)。
#include<iostream> #include<stdio.h> using namespace std; int a[102],s[102]; int n; int main() { int sum,minm,i,j; s[0]=0; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) { scanf("%d",&a[i]); s[i]=s[i-1]+a[i]; } minm=-10; for(i=1;i<=n;i++) { for(j=i;j<=n;j++) { sum=s[i-1]+s[n]-s[j]+(j-i+1)-(s[j]-s[i-1]); if(sum>minm) { minm=sum; } } } printf("%d\n",minm); } return 0; }
究竟是我抛弃了历史,还是历史遗弃了我。