51nod 1050 循环数组最大子段和

来源:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050

答案有两种形式1.正常的最大连续序列 即ans1

        2.开始+末尾的连续的一段,去掉中间,中间为什么去掉呢,因为中间那段和为负数,只要求出负数最大的连续子序列去掉就行了 然后这种情况只要 sum +ans2

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e4+10;
int a[maxn],b[maxn],n;
typedef long long ll;

ll solve (int *s)
{
    ll ans =0,res =0;
    for(int i=0;i<n;i++)
    {
        ans+=s[i];
        res = max(res,ans);
        if(ans < 0)
            ans =0;
    }
    return res;
}

int main ()
{

    scanf("%d",&n);
    ll res=0;
    for(int i=0;i<n;i++)
    {
         scanf("%d",&a[i]);
         b[i] = -a[i];
         res += a[i];
    }
    ll ans1= solve(a),ans2=solve(b);
    res= max(ans1,res+ans2);
    printf("%lld
",res);
    return 0;
}
原文地址:https://www.cnblogs.com/Draymonder/p/7356707.html