动态规划之Rod cutting

动态规划和分而治之相似,不过分治法是将问题划分为没有依赖的子问题,使用递归来解决子问题然后将子问题合并,而动态规划划分的问题之间存在依赖覆盖关系,如果使用分治法来处理会有重复计算的问题导致效率较低,动态规划将已计算的结果存放在表中用来避免重复计算
动态规划一般有如下四个步骤:

  1. 刻画最优解的结构
  2. 递归地定义最优解的值
  3. 自下而上的方式计算最优解的值
  4. 根据计算出的信息构造一个最优解

动态规划的要素

  • 最优子结构
  • 重叠子问题

Rod cutting

五金店的老板娘每次都是采购一个长长的钢管,然后将其切为一段段的小钢管售卖,被切的钢管是整数,对于一个长度为n的钢管,需要计算其最大收益r_n
如下是价格表

价格表

假设钢管的长度n为4,有如下8种切法


其中c切法
4=2+2的总价格为10收益最大,即r_4=10

长度为n的钢管有2^{n-1}种不同的切法 (C_{n-1}^0+C_{n-1}^1+...+C_n^n)

可以发现对于长度为n的钢管,其最大收益r_n满足:

r_n=max(p_n,r_1+r_{n-1},r_2+r_{n-2},...,r_{n-1}+r_1)

这个理解起来不难,整体最优解包含两个相关子问题的最优解,最大化来自这两个片段中的每一个的收益。我们认为钢管切割问题具有最优子结构:问题的最优解包含相关子问题的最优解

对于n=0时,r_0=0,这个公式可以进一步简化为

r_n=\underset{1\leq i \leq n} {max}(p_i+r_{n-i})

这个公式是站在另一个视觉上看问题,钢管切割问题第一段切割长度为i和剩余的n-i长度规模钢管切割构成的子问题的和,第一段切割长度为i,对应的价格是p_i,剩余的n-i长度看成是一个子问题最大收益为r_{n-i},所以r_n是这两者的和

分治法实现

对于如上的推导公式,可以给出如下递归实现的分治法伪代码:

 cutRod(p,n)
    if n==0
      return 0
    q=-1
    for i=1 to n
        q=max(q,p[i]+cutRod(p,n-i))
  return q


上述代码的时间复杂度为2^n,效率比较低

动态规划实现

因此,动态编程使用空间换时间,它提供了一个time-memory trade-off的例子。节省的时间可能是巨大的:可能将指数级别的空间复杂度转为多项式级别的空间复杂度

通常有两种等价的方法来实现动态规划。我们将用我们的Rod cutting例子来说明:

  • 第一种是top-down with memoization,在这种方法中,我们以自然的方式递归地编写过程,但保存每个子问题的结果(通常在数组或哈希表中)。这个过程现在首先检查它是否已经解决了这个子问题。如果是,则返回已保存的值,从而基于已保存的值进一步的计算;如果不是,则过程以通常的方式计算该值。
  • 第二种方法是bottom-up method的方法。这种方法通常依赖于子问题“大小”的一些自然概念,因此解决任何特殊的子问题只依赖于解决“较小”的子问题。我们按大小对子问题进行排序,然后按大小顺序(最小优先)求解它们。在解决一个特定的子问题时,我们已经解决了它的解决方案所依赖的所有较小的子问题,并且保存了它们的解决方案。我们只解决一次每个子问题,当我们第一次看到它时,我们已经解决了它的所有先决子问题。

这两者渐进时间复杂度一样,但是bottom-up通常有更好的常量因子,因为不同于递归它的调用负担少一些

top-down with memoization实现rod cutting的伪代码如下:

memorizedCutRod(p,n)
  let r[0...n] be a new array
  for i=0 to n 
    r[i]=-1
  return  memorizedCutRodAux(p,n,r)
memorizedCutRodAux(p,n,r)
  if r[n]>=0
    return r[n]
  if n==0
    q=0
  else q=-1
    for i=1 to n
      q=max(q,p[i]+memorizedCutRodAux(p,n-i,r))
  r[n]=q
  return q

bottom-up method实现rod cutting的伪代码如下:

bottomUpCutRod(p,n)
  let r[0...n] be a new array
  r[0]=0
  for j=1 to n 
    q=-1
      for i=1 to j
        q=max(q,p[i]+r[j-i])
      r[j]=q
  return   r[n] 

使用动态规划求解的时间复杂度为 \Theta(n^2)

根据计算出的信息构造一个最优解

上述代码给出了最优解的值,却没有给出一个最优解,如下代码可以构造出一个最优解,它使用了一个额外的数组s[i]记录第一个切割的钢管的长度

extendedBottomUpCutRod(p,n)
  let r[0,...,n]   and s[0,...,n] be new array
  r[0]=0
  for j=1 to n
    q=-1 
    for i= 1 to j
      if q< p[i]+r[j-i]
          q=p[i]+r[j-1]
          s[j]=i
       r[j]=q
  return r and s 
printCutRodSolution(p,n)
  (r,s)=extendedBottomUpCutRod(p,n)
  while n>0
    print s[n]
    n=n-s[n]

printCutRodSolution(p,7)会打印1 6 表示一种最优解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269