链接: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;
}

 

 posted on 2013-07-19 19:09  ∑求和  阅读(168)  评论(0编辑  收藏  举报