思路:先确定第一段,再确定第二段,第三段直接取后缀和的最大
#include <iostream>
using namespace std;
const int N=2e5+2;
int n,ans=-1,a[N],b[N],v[N],dp1[N],dp2[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n;i>=1;i--) b[i]=a[i]+b[i+1];
for(int i=n;i>=1;i--) b[i]=max(b[i],b[i+1]);
for(int i=1;i<=n;i++)
if(dp1[i-1]+a[i]>=0)
{
dp1[i]=dp1[i-1]+a[i];
v[i]=1;
}
for(int i=1;i<=n;i++)
{
dp1[i]=max(dp1[i-1],dp1[i]);
v[i]=max(v[i-1],v[i]);
}
for(int i=1;i<=n;i++)
if(v[i-1])
{
dp2[i]=a[i]+max(dp1[i-1],dp2[i-1]);
ans=max(ans,dp2[i]+b[i+1]);
}
if(~ans) cout<<ans;
else
{
sort(a+1,a+n+1);
cout<<a[n-1]+a[n];
}
return 0;
}