51nod 1050 循环数组最大子段和

N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
 

输入

第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N+1行:N个整数 (-10^9 <= S[i] <= 10^9)

输出

输出循环数组的最大子段和。

输入样例

6
-2
11
-4
13
-5
-2

输出样例

20


只需要找出经过数组首尾的最大子段和(总和-不经过首尾的最小子段和)和不经过首尾的最大子段和,对比输出最大。
代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef long long ll;
int n;
int s[50000];
int main() {
    while(~scanf("%d",&n)) {
        ll all = 0,sum1 = 0,sum2 = 0,max_1 = 0,max_2 = 0;
        for(int i = 0;i < n;i ++) {
            scanf("%d",s + i);
            all += s[i];
            sum1 = max(sum1,0ll) + s[i];
            sum2 = max(sum2,0ll) - s[i];
            max_1 = max(max_1,sum1);
            max_2 = max(max_2,sum2);
        }
        printf("%lld
",max(max_1,all + max_2));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/8023spz/p/10908068.html