最大子序列和问题

来源:互联网 发布:js 计算商品选中数量 编辑:程序博客网 时间:2024/06/05 18:01

最大子序列和问题,穷举算法O(n^2),分治算法O(n*logn),动态规划O(n)..

穷举算法:把每两个下标组合成的子序列都计算和,留下最大的

分治算法:把序列分成两半,假设要求的序列是B,那么B要么在序列的左边,要么在右边,或者既包含左边又包含右边。前两种情况可以转化为第三种情况。那么,从中点开始从左边往左找最大的序列,从中点开始向右找最大的序列。时间复杂度为O(n)。总时间复杂度为O(n*logn)。附上算法导论的伪代码。


动态规划算法:假设已知A[0~j]的最大子序列为max所指的那段,temp_sum=sum(A[i..j]),max_sum=sum(A[i..k])。如果temp_sum+A[j+1]>max_sum,显然应该更新max_sum的值。如果temp_sum+A[j+1]<0,说明,sum(A[k..j+1])为负数。且从j+1~k的任意连续子序列和都为负数(假设存在q在k~j之间,且sum(A[q..j+1])>0,那么temp_sum+sum(A[q..j+1])是增加的,不可能因为第j+1个元素出现而变成负数,可以把q~j+1之间的数想象成一个负数处理)。所以,当temp_sum+A[j+1]为负数时,应该舍弃j+1以前的序列,重新开始找最大子序列,因为负数不可能成为最大子序列的第一个数。如果0<temp_sum+A[j+1]<max_sum,正数可能成为最大子序列的第一个数,故继续处理下一个数。


0 0