Algorithm 动态规划的递归解法

Algorithm 动态规划的递归解法,algorithm,dynamic-programming,Algorithm,Dynamic Programming,可能重复: 我一直在试图理解动态编程,但对于每一个新问题,我都有点困惑于如何为它编写递归 以以下问题为例: 有一个L×H金属板,它可以被机器垂直或水平切割成两片。L,H都是整数,切割也沿着积分值进行。有n个矩形图案L(i)×H(i),i≤ n(l,h也是整数),其中第i个模式有c(i)。设计一种高效的算法,以最大化总利润的方式切割板材 现在,我认为为了解决这个问题,我们应该创建一个LxH表(以对角方式填充)。但是,我们如何形成一个递归来解决这个问题呢?我会尝试对每个T(L,H)进行类似的操作

可能重复:

我一直在试图理解动态编程,但对于每一个新问题,我都有点困惑于如何为它编写递归

以以下问题为例: 有一个L×H金属板,它可以被机器垂直或水平切割成两片。L,H都是整数,切割也沿着积分值进行。有n个矩形图案L(i)×H(i),i≤ n(l,h也是整数),其中第i个模式有c(i)。设计一种高效的算法,以最大化总利润的方式切割板材


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

我会尝试对每个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
)
T(L,H)=最大值(
c(L,H),

T(i,H)+T(L-i,H),//0我不明白当你有一个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

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