最大和连续子序列为零?

时间:2015-04-04 03:05:22

标签: python algorithm sequence dynamic-programming

我试图理解这个问题的解决方案:"给定一系列数字,找到这些数字的连续子序列的最大总和。"我在下面引用了一个解决方案和解释。

我不明白的是,在行" maxendinghere = max(maxendinghere + s,0)",为什么maxendherehere永远为零?

def max_sum_subsequence(seq):
    maxsofar = 0
    maxendinghere = 0
    for s in seq:
        # invariant: maxendinghere and maxsofar are accurate
        # are accurate up to s
        maxendinghere = max(maxendinghere + s, 0)
        maxsofar = max(maxsofar, maxendinghere)
    return maxsofar

来自网站的解释是"嗯,基本上maxendhere正在积累子序列 - 它继续滚动下一个元素。如果这个累积的总和变得负数,我们知道我们当前跟踪的子序列 - 结束 - 比空的子序列 - 重新开始 - 这里更糟糕;所以我们可以重置我们的子序列累加器,并且循环不变量的第一个子句仍然成立。"

我不明白的是,让我们说我的序列是2 -3 4:为什么最大值会为零?没有子序列,其总和为零。

(引自:http://wordaligned.org/articles/the-maximum-subsequence-problem

1 个答案:

答案 0 :(得分:2)

在您的示例2 -3 4中,问问自己,在索引1处结束的最大总和是多少? 2 - 3-1-3本身就是-3。因此,我们的最大总和是空的总和,它选择 no 元素,因此总和为0.

请记住,空子序列始终是可能的,并且sum操作的标识值为0.因此,例如,-2 -4 -3内的连续子序列的最大总和就是0,空子序列的总和。

验证这一点:

>>> max_sum_subsequence([-2, -4, -3])
0
>>> sum([]) == 0
True

要更改算法以使子序列的长度必须至少为1,您可以通过更改两行代码来实现。

首先,将maxsofar的初始化更改为第一个元素,如果不存在,则将None更改为None。您可以使用您选择的任何默认值,而不是maxsofar = seq and seq[0] or None 。默认值是为空输入序列返回的值。

maxendinghere

其次,将赋值更改为maxendinghere = max(maxendinghere + s, s) 以强制它包含序列中至少一个元素的值:

{{1}}
相关问题