看起来简单的逻辑,有着神奇的结果。
解题思路:本题要求最大字段和,首先设定一个初始max=0;从第一个数字开始进行累加,每累加一次都有三种情况:
1、累加后的值比原先大了,则要跟新原来的max;
2、累加后的值比原来小了但比零大,则不跟新原来的max;
3、累加后的值比原来小了并且小于零,则不跟新原来的max,且累加求和的值要置为0;
源码附上:
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 50000+5;
int a[MAXN];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
long long Max = -1, sum = 0;
for(int i=1; i<=n; i++)
{
if(sum >= 0)
sum += a[i];
else
sum = a[i];
if(sum > Max)
Max = sum;
}
printf("%lld\n",Max);
}
return 0;
}