自上而下DP的自下而上DP

时间:2014-05-15 14:11:43

标签: algorithm dynamic-programming

我在想是否有一些将自上而下的动态编程转换为自下而上编程的通用方法。

我们能否想出一些机制,它给出了自上而下的DP可以转换为自下而上DP的正式方式。

注意:我是动态编程的初学者,我看到的自顶向下方法转换为自下而上方法的问题非常不同。所以我不确定是否可以采用一种通用方式。

通过概括我的意思是,应该如何初始化数组,应该是数组的大小以及数组应该有多少维度。

2 个答案:

答案 0 :(得分:5)

动态程序的执行可以被视为有向非循环图,其中每个顶点是子问题,并且弧表示需要针对特定​​子问题的解来计算另一个子问题的解。具有memoization的自上而下的递归程序实际上是通过深度优先搜索从拓扑中对从根问题可到达的图形的子图进行拓扑排序。要将其转换为自下而上的方法,您需要自己制定合适的拓扑顺序,这些顺序因问题而异。

答案 1 :(得分:2)

自上而下的解决方案通常更好,因为它只解决了必要的子问题。将自下而上的解决方案转换为自上而下是非常简单的,您只需按需计算和存储子问题,而不是预先计算所有子问题。另一种方法可能很棘手,因为您需要知道要解决的子问题。根据问题,在不检查上层问题的情况下找到子问题的难度可以从容易到不可能。例如,请考虑以下内容:您有一个无限彩色的加权图,其顶点用10种颜色着色。距离给定A Verticle最近的蓝色垂直的距离是什么。可以向上解决它,但是自下而上是不可能的,因为你需要从图的所有蓝色顶点开始。