我无法理解麻省理工学院开放课件讲座here中指定的文本对齐问题的动态编程解决方案。该讲座的一些注释是here,注释的第3页就是我所指的。
我认为动态编程意味着你会记住一些计算,这样你就不需要重新计算,从而节省你的时间,但是在演讲中给出的算法中,我没有看到任何用途memoization,只是一大堆深度递归调用,即主要功能是:
DP[i] = min(badness (i, j) + DP[j] for j in range (i + 1, n + 1))
DP[n] = 0
其中badness
是一个函数,用于确定从行长度中减去单词长度后未使用空间量。对我来说,这个算法似乎计算了所有可能的"不良"计算并选择最小的一个,这对我来说似乎是蛮力。动态编程通常通过记忆过去的计算给我们带来什么好处,所以我们不必重新计算?
答案 0 :(得分:2)
如果您记住结果,则不必多次计算每个DP[i]
。
即DP[0]
"来电"例如DP[2]
,但DP[1]
也是如此。在第二次调用DP[2]
时,再次计算它是不必要的,您只需返回记忆值即可。
这也可以轻松验证此算法的多项式上限。由于每个DP[i]
将执行O(n)操作,并且有n
个,因此整体算法为O(n ^ 2),当然假设badness(i, j)
为O (1)。