我搜索了一些现有的文字 Dynamic programming and memoization
但我仍然无法结束我的怀疑。
记忆很容易查看和实施。但相应的DP解决方案需要很多大脑。有时,我无法通过DP范例找到解决方案。
我想知道如果问题通过记忆解决(自上而下的方法),是否强制存在DP自下而上的解决方案?
答案 0 :(得分:2)
是的,每个具有自上而下解决方案的动态编程问题也都有相应的自底向上动态编程解决方案。
您可以通过将任何DP问题的状态空间可视化为DAG来证明这一点,其中节点表示状态,边缘表示节点之间的依赖关系。例如,如果DAG中存在从A到B的边缘,则意味着要获得状态A的解,我们必须首先解决状态B.
因此,自下而上解决问题等同于以与topological sort相反的顺序对DAG的顶点应用动态编程。
答案 1 :(得分:2)
在某种程度上,是的,但细节可能很麻烦。
自下而上和自上而下方法的主要区别在于我们知道提前遍历状态空间的顺序。
如果您正在探索具有深度优先搜索的图形(这是memoization本质上所做的),则存在一个顺序,其中该图形的顶点被完成处理(顶点的值被计算并被记忆)。可以通过拓扑排序图来找到此顺序。然后,您可以按顺序计算值,可以将其视为自下而上。
但是,对于某些图表,没有与图表一致的拓扑顺序,并且以简单方式表达(如for (row) for (col) calc (row, col)
)。
自下而上的另一个问题是,使用自上而下的解决方案,我们只访问我们实际需要计算的状态,并且它们的数量可能小于状态总数。
添加。此外,对于某些算法,订单是根据我们计算的值即时计算的。 举一个简单的例子,Dijkstra's algorithm可以被视为动态编程,但顶点被添加到最短路径树的顺序取决于我们计算的距离。 因此,我们必须找到所有最短距离,以这种或那种方式找到订单,因此在找到订单后任何自下而上的解决方案都变得不必要。