题目描述
老师给笑笑布置了一份的作业,笑笑不知如何解决,找你帮忙解决。
老师给了一串很长的数列,要求从中找出连续的一段来使得总和最大。
输入格式
文件中第一行包括一个整数N,表示数列长度为N(N <= 100000)。
第二行包括N个整数来描述这个数列,每个整数的绝对值不超过1000。
输出格式
文件中只有一个整数,为最大的连续段总和。
输入样例
5
1 -2 3 1 -4
输出样例
4
非常经典的题目
遍历数列,维护一段临时的子段和,当子段和为负的时候,丢掉从0开始重新维护
因为当子段和为负的时候,对之后的字段和肯定没有帮助,所以就不要,然后正的就一直留着,因为是正的,加上肯定越加越大,加到了负的值,没有关系,只要子段和不为负就没关系,每次子段都和结果比较,找出最大的那个
不理解直接看代码
#include<iostream>
#include<algorithm>
using namespace std;
int a[100010];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int res = -1000000;
int tmp = 0;
for(int i=0;i<n;i++){
tmp += a[i];
res = max(res, tmp);
if(tmp < 0) tmp = 0;
}
printf("%d", res);
return 0;
}