最大子段和

題目描述
給出一段序列,選出其中連續且非空的一段使得這段和最大。
輸入格式:
第一行是一個正整數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

發佈了50 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章