【问题标题】:Recursive solution to Dynamic Programming [duplicate]动态规划的递归解决方案
【发布时间】:2012-10-05 17:55:00
【问题描述】:

可能重复:
Dynamic Programming and Knapsack Application

我一直在尝试理解动态编程,但每遇到一个新问题,我都会对如何为其编写递归感到有些困惑。

做以下问题: 有一块 L × H 的金属板,可以用机器垂直或水平切割成两块。L、H 都是整数,切割也沿着整数值发生。有 n 个矩形图案 l(i)×h( i) , i ≤ n (l , h 也是整数) 其中第 i 个模式的利润为 c(i)。设计一种有效的算法来切割板材以使总利润最大化。

现在我认为为了解决这个问题,我们将创建一个 LxH 表(将按对角线填充)。但是我们如何形成一个递归来解决这个问题呢?

【问题讨论】:

  • 您应该从递归 O(2^n) 解决方案开始,看看如何将其优化为多项式解决方案,而不是相反。
  • @jli 我该如何着手解决这个问题?
  • 同样的问题here
  • 一个动态规划问题可以通过定义使用递归来解决,因为每个不是基本情况的实例都可以使用动态规划和一些额外的步骤来解决。这与递归有何不同尚不清楚。你确定这不是家庭作业吗?

标签: algorithm dynamic-programming


【解决方案1】:

我会为每个 T(L, H) 尝试类似的方法,验证以下之间的最佳选择:

  • 立即收取利润
  • 水平切割所有可能的方式
  • 垂直切割所有可能的方式

类似:

T(L, H) = max(
    c(L, H),  
    T(i, H)+T(L-i, H), // 0<i<L
    T(L, i)+T(L, H-i)  // 0<i<H
)

【讨论】:

    【解决方案2】:

    我不明白为什么你真的想在有 dp 关系时使用递归。回溯递归通常效率很低,因为它的复杂度通常为 O(2^N) 或更高。

    然而,那些指数算法很像这样:

    function rec(state)
        if state = end
           return
        Choose the current element
        rec(state + 1)
        Don't choose the current element
        rec(state + 1)
    

    在您的情况下,这可能类似于这种蛮力:

      function rec(rect r)
          if r is empty
            return 0
          Max = 0
          for i = 1 to r.width
              for j = 1 to r.hight
                 rect g = cut(r, i, j)
                 Max = max(Max, profit(g) + rec(r - g))
          return Max
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      相关资源
      最近更新 更多