【发布时间】:2012-01-28 19:23:37
【问题描述】:
我正在重新阅读 Skiena 的算法设计手册,以了解一些我从学校开始就忘记的东西,我对他对动态编程的描述感到有些困惑。我在 Wikipedia 和其他各种网站上查找了它,虽然这些描述都很有道理,但我自己却无法找出具体的问题。目前,我正在研究 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) 动态规划解决方案是什么?我觉得我几乎明白了,但我错过了一些东西。
【问题讨论】:
标签: algorithm dynamic-programming