最大子段和

来源:互联网 发布:开淘宝网店需要多少钱 编辑:程序博客网 时间:2024/05/18 20:07

题目描述
给出一段序列,选出其中连续且非空的一段使得这段和最大。
输入格式:
第一行是一个正整数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

原创粉丝点击