分两种情况。
1 不循环,就是按照0--n-1遍历找最大和
2 循环。那么区间肯定是过了起点<n-1并且终点的坐标<起点的坐标。这样终点----起点的坐标这段就是循环数组的最小子段和
然后总和减去这个最小字段和。
判断两种情况的大小
#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
const int mod=1e9+7;
int main(){
int n;
cin>>n;
int a[500001];
long long SUM=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
SUM+=a[i];
}
long long sum1=0,out1=0;
for(int i=0;i<n;i++){
if(sum1+a[i]>0){
sum1+=a[i];
}
else sum1=0;
if(sum1>out1) out1=sum1;
}
long long minn=0,out2=1<<29;
for(int i=0;i<n;i++){
if(minn+a[i]<0) minn+=a[i];
else minn=0;
if(minn<out2) out2=minn;
}
printf("%lld",max(out1,SUM-out2));
return 0;
}