连续一段的最大区间和递推方程 f [ i ] = max( f [ i - 1 ] + a [ i ] , a [ i ] )O(n)复杂度
前后做两次再做两次计算不连续的最大区间和
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 500020
using namespace std;
int n,a[maxn],sum[maxn];
int f[maxn],g[maxn],ff[maxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
sum[i]=sum[i-1]+a[i];
}
int last=0;
for(int i=1;i<=n;i++){
f[i]=max(f[i],sum[i]-last);
last=min(last,sum[i]);
}
last=-1e9;
for(int i=1;i<=n;i++){
ff[i]=max(f[i-1],last);
last=max(last,f[i-1]);
}
memset(sum,0,sizeof(sum));
for(int i=n;i>=1;i--){
sum[i]=sum[i+1]+a[i];
}
int ans=-1e9;
last=0;
for(int i=n;i>=1;i--){
g[i]=max(g[i],sum[i]-last);
last=min(last,g[i+1]);
ans=max(ans,g[i]+ff[i]);
}
printf("%d",ans);
return 0;
}