【问题标题】:Bottom Up DP from Top Down DP自顶向下 DP 自底向上 DP
【发布时间】:2014-07-04 01:10:53
【问题描述】:

我在想是否有某种通用方法可以将自顶向下动态编程转换为自底向上编程。

我们能不能想出一些机制来提供正式的方式,通过这种方式我们可以将自上而下的 DP 转换为自下而上的 DP。

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

广义上的意思是,数组应该如何初始化,数组的大小应该是多少以及数组应该有多少维。

【问题讨论】:

  • “我已经看到自上而下的方法转换为自下而上的方法非常不同” 通常转换很简单。但是,如果您首先进行转换,可能是因为解决子问题的某些特定顺序允许您进行某些特定优化。这是它可能变得复杂的地方,例如参见codeforces.com/blog/entry/8219

标签: algorithm dynamic-programming


【解决方案1】:

动态程序的执行可以看作是一个有向无环图,其中每个顶点都是一个子问题,弧表示需要特定子问题的解决方案来计算另一个子问题的解决方案。具有记忆功能的自顶向下递归程序本质上是在拓扑上对该图的子图进行排序,该子图可通过深度优先搜索从根问题到达。要将其转换为自下而上的方法,您需要自己制定合适的拓扑顺序,这会因问题而异。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-04-14
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2011-06-25
      • 2018-08-01
      • 1970-01-01
      相关资源
      最近更新 更多