头条一面第二次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
",ans);
}