P1115 最大子段和
给出一段序列,选出其中连续且非空的一段使得这段和最大。
输入输出格式
输入格式:
第一行是一个正整数N,表示了序列的长度。
第二行包含N个绝对值不大于10000的整数Ai,描述了这段序列。
输出格式:
一个整数,为最大的子段和是多少。子段的最小长度为1。
输入输出样例
输入样例#1:
7 2 -4 3 -1 2 -4 3
输出样例#1:
4
因为子段和是连续的一段数字,所以,我们可以先设第一个数为最大值,
如果将这串数字依次相加,如果比最大值大,那么将最大值换为现在的值
如果和出现了小于0的情况那么再加只会比原来的数小,此时,将子段的头
变成下一个数即可,代码如下
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int sum = 0, ans = 0;
for(int i=0; i<n; i++)
{
int a;
scanf("%d", &a);
sum = sum + a; //计算子段和
if(i == 0) //先将第一个数赋值为子段和的开头
ans = sum;
if(sum > ans) //当子段和要大于最大值时,改变最大值
ans = sum;
if(sum < 0) //当和变成负数时,将子段和清零,重新开始加
sum = 0;
}
if(sum > ans && ans >= 0 && sum >= 0) //可能出现一串数字全为负数的情况
ans = sum;
printf("%d\n", ans);
}