今天比赛有这样一题:
有a{n} 这样一个数列,其中a{i} ,a{i+1} ,a{i+2} ,a{i} ,a{i+k} ….. 这样的叫做a{n} 的一个子数列,求a{n} 最大子数列的值,数列长度<=1000
例如: -6 -2 3 -4 其最大子数列为3,值为3
1 2 3 -1其最大子列为{1 2 3},值为6
即求一个连续的数列使得数列内的元素和最大。
kadane算法正是这个问题的最优解法之一
算法描述:
- 遍历该数组,在遍历过程中,将遍历到的元素依次累加起来,当累加结果小于或等于0时,从下一个元素开始,累加值归零,重新开始累加
- 累加过程中,要用一个变量记录所获得过的最大值
- 一次遍历之后,变量中存储的即为最大子片段的和值
- 时间复杂度O(n)
- 遍历过程中,当累计值为负是,下一个元素作为潜在最大子数列的起始元素, 重新开始累加
#include <stdio.h>
#define MAX 1000+5
int MAX_(long long a, long long b)
{
if (a >= b)
return a;
else
return b;
}
int main()
{
int i = 0;
int N = 0;
long long sum = 0;
long long ans = 0;
long long number[MAX];
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%lld", &number[i]);
}
for (i = 0; i < N; i++)
{
if (sum >= 0)
{
sum += number[i];
ans = MAX_(sum, ans);
}
else
{
sum = number[i];
ans = MAX_(sum, ans);
}
}
printf("%lld", ans);
return 0;
}