来源:JK老班
题目:对于一个给定的长度为N的整数序列A,它的“子序列”的定义是:A中非空的一段连续的元素(整数)。你要完成的任务是,在所有可能的子序列中,找到一个子序列,该子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你输出这个最大值。
输入:
输入文件的第一行包含一个整数N,第二行包含N个整数,表示A。
其中
1 <= N <= 100000
-10000 <= A[i] <= 10000
输出:
输出仅包含一个整数,表示你算出的答案。
样例输入
5 3 -2 3 -5 4
样例输出
4
#include<iostream>
using namespace std;
int A[100001];
int main(){
int N; cin>>N;
for(int i=0;i<N;i++) cin>>A[i];
int MaxSum=A[0];
int MaxEnd=A[0];
for(int i=1;i<=N;i++)//从第二个元素开始
{
if(MaxEnd>0){//前一个元素结尾的最大子段和大于0,加上,即与前面的组成一个序列
MaxEnd+=A[i];
}else{
MaxEnd=A[i];//否则,自立门户,子段仅有A[i],即不与前面的数组成一个序列
}
if(MaxEnd>MaxSum) MaxSum=MaxEnd;
}
cout<<MaxSum;
}