我正在重新阅读Skiena的《算法设计手册》以补充一些我在学校忘记的内容,但他对动态规划的描述让我有点困惑。我已经在维基百科和其他各种网站上查过了,虽然这些描述都很有道理,但我仍然无法自己解决具体问题。目前,我正在解决Skiena书中的第3-5题。(给定一个由n个实数组成的数组,在输入的任何连续子向量中找到最大的总和。)我有一个O(n^2)的解决方案,例如在这个答案中所描述的那样。但是我卡在了使用动态规划的O(N)解决方案上。我不清楚递归关系应该是什么。
我不明白如何在线性时间内选择最大的一个。我尝试过记录到目前为止最大的总和,并且如果当前值为正,则将其添加到总和中。但是当您有更长的序列时,这就成为问题了,因为可能会有一段负数序列会减少总和,但稍后出现的大正数可能会使它重新成为最大值。
我还想起了区域和表。您可以仅使用累积和计算所有和:a,a+b,a+b+c,a+b+c+d等。(例如,如果您需要b+c,则只需(a+b+c)-(a)。)但我看不到获取其的O(N)方法。
有没有人能够向我解释针对这个特定问题的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)动态编程解决方案是什么?我觉得我几乎明白了,但似乎还漏了些什么。