动态规划的递归解决方案

时间:2012-10-05 17:55:01

标签: algorithm dynamic-programming

  

可能重复:
  Dynamic Programming and Knapsack Application

我一直在尝试理解动态编程,但是对于每个新问题,我对如何为它编写递归感到困惑。

采取以下问题: 有一个L×H金属板,可以通过机器切割成垂直或水平两件.L,H是整体,切口也沿整数值发生。有n个矩形图案l(i)×h( i),i≤n(l,h也是积分),其中第i个模式具有pro c c(i)。设计一种高效的算法,以某种方式切割纸张,从而最大限度地提高总体利润。

现在我想解决这个问题,我们会创建一个LxH表(它将以diaganally方式填充)。但是我们如何形成一个递归来解决这个问题?

2 个答案:

答案 0 :(得分:2)

我会为每个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
)

答案 1 :(得分:1)

我不明白为什么你真的想在有dp-relation时使用递归。回溯 - 递归通常非常低效,因为其复杂度通常为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