概念:
当前位置:本算法只遍历一边,当前遍历到的位置
子序列:位置连续的几个数
当前子序列:当前要考虑的子序列,这里设定当前子序列是负就要舍弃
临时和最大子序列:遍历没完成前,临时记录的和最大子序列,遍历完成它就是最终结果
思路:
首先,当前子序列为空,当前子序列和为0
开始,遍历
当前子序列和 + 当前位置书,看结果是正还是负
正(或0): 把当前元素加入当前子序列,并于临时最大和最大子序列比较并更新之
负:当前子序列归空
#include <stdio.h>
#include <stdlib.h>
void max_seq(int a[], int len)
{
int max, max_begin, max_end;
int cur, cur_begin, cur_sum;
max = 0;
cur_sum = 0;
cur_begin =-1;
for( cur = 0; cur < len; cur++)
{
int val = a[cur];
cur_sum = cur_sum + val;
if ( cur_sum >= 0)
{
if ( cur_begin < 0)
cur_begin = cur;
if ( cur_sum > max) //update max
{
max = cur_sum;
max_begin = cur_begin;
max_end = cur;
}
}
else //reset current
{
cur_sum = 0;
cur_begin = -1;
}
}
printf("\n====== give seq is =====\n");
for (int i=0; i<len; i++)
printf(" %d",a[i]);
printf("\n==============\n");
printf(" max %d, begin %d, end %d\n",max,max_begin,max_end);
}
#define LEN 50
int main(void)
{
int a[]= {1,2,-4,5,-1,3,6};
max_seq(a, 7);
int b[LEN];
for ( int i=0; i<LEN; i++)
{
b[i] = (rand() % 20) * (rand() % 2 ? 1 : -1);
}
max_seq(b, LEN);
}