两段不相邻子段和之和最大

头条一面第二次GG,肚子不疼了,人蠢了。

题目:给一个数组,求出两段 不相邻也不相交的子段和 之和 最大。

如果是单段,那么就是一个普通的最大子段和问题。
然而分成了两段,也是简单的一批
两次遍历求出从前缀和后缀的最大子段和,即1到n每个位置的最大子段和,以及n到1每个位置的最大子段和,这样就可以分区间考虑了。

最后一次,遍历枚举整个数组,求第i位为区间间隔的L【i-1】+R【i+1】的最大值。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int l[maxn],a[maxn],r[maxn],n;
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;++i)scanf("%d",&a[i]);
    int sum=0,tmp=-99999999;
    for(int i=0;i<n;++i)
    {
        sum+=a[i];
        if(sum>tmp)tmp=sum;
        if(sum<0)sum=0;
        l[i]=tmp;
    }
    sum=0,tmp=-99999999;
    for(int i=n-1;i>=0;--i)
    {
        sum+=a[i];
        if(sum>tmp)tmp=sum;
        if(sum<0)sum=0;
        r[i]=tmp;
    }
    int ans=-9999999;
    for(int i=1;i<n-1;++i) ans=max(ans,l[i-1]+r[i+1]);
    printf("%d\n",ans);
}
posted @ 2019-01-25 19:32  KuroNekonano  阅读(196)  评论(0)    收藏  举报