我不确定这个答案是否会有所帮助,因为我知道您的问题不是关于算法本身,而是关于如何用 Python 实现它(我不知道 Python)。但是您可以使用另一种算法,也许您可以在不寻求任何帮助的情况下实施。请注意,此算法仅计算总和,而不是产生该总和的序列(据我所知,这就是您想要的)。下面是类似 C 的伪代码解决方案:
int findMax(sequence, length) {
int maxSumStartingAt[length];
maxSumStartingAt[length - 1] = sequence[length-1];
for(int i=length-2; i >= 0; i--) {
int tempSum = sequence[i] + maxSumStartingAt[i+1];
if ( sequence[i] > tempSum ) {
maxSumStartingAt[i] = sequence[i];
} else {
maxSumStartingAt[i] = tempSum;
}
}
int maxSum = maxSumStartingAt[0];
for(int i = 1; i < length; i++) {
if ( maxSum < maxSumStartingAt[i] ) {
maxSum = maxSumStartingAt[i];
}
}
return maxSum;
}
现在我将向您解释此解决方案的工作原理。
1) 由于产生最大和的子序列必须从某个索引 i 开始,因此我们的想法是为每个索引 i 计算从 i 开始的连续元素的最大和。结果是这些总和之间的最大值。
2) 现在,如果有人告诉你产生最大和的元素的子序列从索引 i 开始,并且从索引 i+1 开始的子序列的最大连续元素和是 x,你怎么计算想要的金额?它只是之间的最大值
sequence[i]
和
sequence[i] + x
我们可以使用这些信息来计算每个索引 i 从索引 i 开始的最大总和:我们从序列的最后一个元素开始,也就是
sequence[length-1]
如果我们从 0 开始索引。从该索引开始的最大总和是多少,我将其称为 maxSumStartingAt[length-1]?
可以是
sequence[length - 1]
本身,因为这是一个 1 元素序列。从索引长度 - 2 开始的最大总和是多少?这是
之间的最大值
sequence[length-2]
和
sequence[length-2] + maxSumStartingAt[length-1]
从索引长度 - 3 开始的最大总和是多少?同样,它是之间的最大值
sequence[length-3]
和
sequence[length-3] + maxSumStartingAt[length-2]
我们可以将这个公式应用于序列的每个索引,最终我们会到达索引 0,并且每个索引的总和都从通用索引 i 开始。这正是解决方案中的第一个 for 循环所做的。此时,我们所要做的就是找到所有计算和之间的最大值(这是解决方案中的第二个 for 循环所做的)。这个最大值就是结果。
关于您的解决方案的注释。鉴于我不了解 Python,所以我无法判断您发布的代码,如果它完全符合您在问题中所说的(即将序列分成两半并计算每半的最大总和,然后返回最大值在这两个值之间)它不起作用,因为它不涵盖最大和由跨越两半的序列产生的情况。