51nod 1050 循环数组最大子段和
来源:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050
答案有两种形式1.正常的最大连续序列 即ans1
2.开始+末尾的连续的一段,去掉中间,中间为什么去掉呢,因为中间那段和为负数,只要求出负数最大的连续子序列去掉就行了 然后这种情况只要 sum +ans2
#include<bits/stdc++.h> using namespace std; const int maxn = 5e4+10; int a[maxn],b[maxn],n; typedef long long ll; ll solve (int *s) { ll ans =0,res =0; for(int i=0;i<n;i++) { ans+=s[i]; res = max(res,ans); if(ans < 0) ans =0; } return res; } int main () { scanf("%d",&n); ll res=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); b[i] = -a[i]; res += a[i]; } ll ans1= solve(a),ans2=solve(b); res= max(ans1,res+ans2); printf("%lld\n",res); return 0; }