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