您能否指出一些自下而上比自上而下更有益的动态编程问题陈述?(即简单的 DP 更自然地工作,但记忆化会更难实现?)
我发现使用记忆的递归要容易得多,并且希望解决自下而上是更好/也许唯一可行的方法的问题。
我知道理论上两者都是等价的,所以即使是易于实现之类的东西也可以算作好处。
您能否指出一些自下而上比自上而下更有益的动态编程问题陈述?(即简单的 DP 更自然地工作,但记忆化会更难实现?)
我发现使用记忆的递归要容易得多,并且希望解决自下而上是更好/也许唯一可行的方法的问题。
我知道理论上两者都是等价的,所以即使是易于实现之类的东西也可以算作好处。
您将根据手头的问题应用自下而上的记忆或自上而下的记忆递归。
例如,如果您必须找到路径图的最小权重无关路径,您将使用自下而上的方法,因为您必须解决所有可能的子问题。
但是如果你必须解决背包问题,你可能想使用递归自上而下的记忆,因为你必须解决有限数量的子问题。自下而上处理背包问题将导致算法解决许多原始子问题中未使用的冗余问题。
决定使用哪种算法时要考虑的两件事
fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)
,我们只需要存储过去的两次计算话虽如此,自下而上并不总是最好的选择,我将尝试举例说明:
nmlog(nm)
DP 之前的额外预处理时间