最大子段和

题目描述
给出一段序列,选出其中连续且非空的一段使得这段和最大。
输入格式:
第一行是一个正整数N,表示了序列的长度。
第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列。
输出格式:
仅包括1个整数,为最大的子段和是多少。子段的最小长度为1。
【数据规模与约定】
对于40%的数据,有N ≤ 2000。
对于100%的数据,有N ≤ 200000。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,b[200001][3],minn;
int main(){
    scanf("%d",&n);
    for(int i = 1;i<=n;i++){
        scanf("%d",&b[i][0]);
        b[i][1] += b[i][0] + b[i-1][1];
    }
    b[1][2] = b[1][0];
    minn = min(b[1][1],0);
    for(int i = 2;i<=n;i++){
        b[i][2] = b[i][1] - minn;
        minn = min(minn,b[i][1]);
    }
    int maxn = -100001;
    for(int i = 1;i<=n;i++){
        maxn = max(maxn,b[i][2]);
    }
    cout<<maxn;
    return 0;
}

b[i][1]表示i之前的所有单位的和
minn存储i之前的不间断的单位的和的最小值
因为绝对值不大于10000,所以maxn初始值尽可能小,不能为0

posted @ 2017-12-16 19:30  WenOI  阅读(154)  评论(0编辑  收藏  举报
水波背景