对于环形序列,最大子序列和为max{MAX,SUM-MIN};
其中:
MAX表示最大子序列和
SUM表示序列总和
MIN表示最小子序列和
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define ll long long
#define vi vector<int>
#define si set<int>
#define pi pair<int,int>
#define pii pair<ll,ll>
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> m(n+1,0);
rep(i,1,n){
cin>>m[i];
}
//sliding windows size = n
/*testdata
6
1 2 3 -5 6 -1
*/
long long sum=0,most=0,tot=0,ant=0,less=0;
rep(i,1,n){
tot+=m[i];
ant+=m[i];
less=min(less,ant);
if(ant>0) ant=0;
sum+=m[i];
most = max(most,sum);
if(sum<0) sum=0;
}
cout<<max(tot-less,most);
return 0;
}