algorithm - 如何使用动态规划找到子序列的最大总和?

标签 algorithm dynamic-programming

我正在重读 Skiena 的《算法设计手册》,以弥补自学校以来我忘记的一些内容,我对他对动态规划的描述感到有些困惑。我在维基百科和其他各种网站上查找过,虽然描述都很有道理,但我自己却无法找出具体问题。目前,我正在研究 Skiena 书中的问题 3-5。 (给定一个包含 n 个实数的数组,找到输入的任何连续子向量中的最大总和。)我有一个 O(n^2) 解决方案,如 this answer 中所述。 .但是我坚持使用动态编程的 O(N) 解决方案。我不清楚递归关系应该是什么。

我看到子序列形成一组总和,如下所示:

S = {a,b,c,d}

a    a+b    a+b+c    a+b+c+d
     b      b+c      b+c+d
            c        c+d
                     d

我不明白的是如何在线性时间内选择哪个是最大的。我试过做一些事情,比如跟踪迄今为止的最大总和,如果当前值为正,则将其添加到总和中。但是当你有更大的序列时,这就会成为问题,因为可能有一段负数会减少和,但后来的大正数可能会使它恢复到最大值。

我还想起了总面积表。您可以仅使用累积和来计算所有总和:a、a+b、a+b+c、a+b+c+d 等。(例如,如果您需要 b+c,则只需 (a+ b+c) - (a).) 但是看不到 O(N) 的方法。

谁能向我解释一下这个特定问题的 O(N) 动态规划解决方案是什么?我觉得我几乎明白了,但我错过了一些东西。

最佳答案

你应该take a look to this pdf回到学校 http://castle.eiu.edu这是:

enter image description here

下面伪代码的解释也是在pdf中。 enter image description here

关于algorithm - 如何使用动态规划找到子序列的最大总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8649845/

相关文章:

string - 为什么这个最长公共(public)子序列的 DP 解决方案可以正常工作?

java - 使用动态规划遍历矩阵的最大成本

java - 查找达到给定值的最小包装数

algorithm - 匹配大小的动态规划(最小差异)

c# - 递归 - 二叉树

algorithm - 使用分而治之算法查找未排序数组中的最大和

algorithm - 向量中元素的动态减少

java - 我的划分序列代码并不能解决它遇到的所有问题

javascript - 计算数组中的组合产品

c++ - 组最高值的最小可能总和