难以捉摸的动态规划

原创 2011年08月02日 13:32:46

        不知在你眼中,动态规划在众多算法中处于什么地位呢?是ACM比赛中不可或缺的技巧之一,又或者是征战POJ水题必备的利器?倘若果真如此,那我多少有些羡慕你,因为我至始至终都没有领悟动态规划的精髓。

        自我阅读《算法导论》已久,我对书上给出的解决特定问题所用到的算法并无太多不明朗之处,而且在遇到相似的问题时,可以很快意识到自己熟知的某个算法能够高效的解决这个问题。但是我不太明朗的地方在于:动态规划并非是解决某个特定问题的算法,他是解决一类问题的算法思想(寻求问题的最优解)。或许我们能够很轻松的理解某个基于动态规划而形成的算法(比如说Bellman-Ford算法),但是理解算法背后动态规划的思想则需要颇费一番功夫。

 


        我们还是从最简单的0-1背包问题说起,因为很多人都是从这个问题开始接触动态规划。在背包问题上,给出最详细,最清晰解答的当之无愧是背包问题九讲。但是作者自己也明言因为存在思维上的跳跃,他的语言向来不以易于理解为长,所以若不是已经对动态规划有了完善认识的高手和准高手们,思考起来还是颇为费力的。

 

0-1背包问题:有N件物品和一个容量为V的背包。对于i≤N,第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

 

        在未系统学习算法之前呢,估计面对这种问题时我会毫不犹豫的直接使用强力法,将N种物品的所有组合枚举出来,然后依次比较在不超过容量V的情况下各组合的总价值。没有悬念的,这是非常天真以及笨拙的做法,其时间复杂度为O(2^N)。

        那么如何使用动态规划呢?对于i≤N,考虑将前i件物品放入容量为V的背包中这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为前i-1件物品放入容量为V的背包中的最大价值;如果放第i件物品,那么问题就转化为第i件物品的价值加上前i-1件物品放入剩下的容量为V-c[i]的背包中的最大价值。

        上面这段话是来自于背包问题九讲的讲解(我略去了转移方程),其正确性当然是毋庸置疑的。但是有一点,并且是很重要的一点是,我们为什么会这样思考呢?换句话讲,我脑海中的疑问并不是会不会解决这个问题,而是解决这个问题的思想究竟是如何创造出来的。一想到有可能自己纯粹只是理解算法的内容,而不能理解算法本身来历的前中后末,以及产生的灵感,我就有些坐卧难安。就说现在,如果要我解释0-1背包问题,我也能说的头头是道,但是一旦别人问起我是如何想到这个方法的,我便脑中一愣,呆若木鸡。

 


        知其然知其所以然,这是在算法学习中久经考验的黄金法则。如果不能做到知其所以然,知其然也是白搭。对于算法而言,不仅在于你会不会运用这个算法,更重要的在于是否理解这个算法的思想。在这种条件下,也许在某些时日之后,你也能创造出属于自己的算法。

        事实上,对于同一个问题,如果我们多琢磨琢磨,总能有意外的收获。思考所带来的裨益性无可争议,我相信思考得越多,对问题的解法就理解得越为深刻。比如让我们使背包问题更为具体些,假设这些物品都是珠宝,分别为钻石,玛瑙,翡翠,水晶等等。我们希望在总价值最大的情况下,珠宝类别的种类同时也最多(物品中存在重复的类别)。这样在求解过程中我们不得不更为详细的记录当前背包中的物品类别,比较的过程也变得复杂了。但是有一点不变的是,我们仍然可以使用动态规划来求解。不仅是背包问题,在最短路径问题之中,动态规划也得到了广泛的使用。就像前文所说的那样,动态规划是为了解决最优化这一类问题的算法思想。

        熟读《算法导论》的读者都知道,最优子结构和重叠子问题是动态规划能否使用的两点主要特征。0-1背包问题就具备这样的性质,我们总是构造子问题的最优解,并且最终的结果中也包含子问题的最优解。我们把每次对子问题求解的结果用一个数组存储起来,就避免了重复求解的过程。但并不是所有最优化的问题都能用动态规划求解,比如书中列举出的无权最长路径便不存在最优子结构,也就是说子问题中的最优解相互干扰,合并为原问题之后的解不能满足原问题所要求的限制。所以这类问题通常被我们划分为NP完全问题,即迄今为止还未能发现更高效的算法解决此类问题,其时间复杂度不能降为多项式时间。

        动态规划之所以难以理解,一方面在于不容易确定问题的最优子结构,只要我们能迅速确立其转移方程,问题多半也就解决了。另一方面在于其自底向上的思想与我们习惯的思维方式是违背的,我们往往会从全局的层次上考虑问题,自顶向下来思考子问题的解,这样我们很容易陷入递归分解问题的困境,以至于对动态规划有些捉摸不透了。

 

 

        我一向以为,贯穿这无数美妙算法之中的算法思想归根到底来自于两点:一是分治,二是递归(其实严格来讲,分治的算法思想也能解决递归问题)。分治的思想是把原本庞大的问题分解为几个较小的问题,分而治之后再合并,最为典型的例子自然是归并排序了。递归的思想是把原来的问题转换为一个递推式,如果我们想求原问题,那么我们需要先解决子问题,在求解子问题的时候我们发现先需要解决子问题的子问题,然后依此类推。递归算法中的翘楚自然就属于动态规划了。

        那么分治思想与递归思想的同异之处又是什么呢?相同之处自然都是将原本的问题转化为更小的问题。相异之处在于分治算法遵从平均主义,总是将问题分解为几个规模等同的子问题,若写成函数属于f(n) = af(n/b) + g(n)的形式;而递归思想则只是将原问题转化为单独较为简单的子问题,转化的速度远远不及分治,若写成函数则属于f(n) = f(n-c) + f(c) + g(n)的形式(两个函数中的a, b ,c均为常数,函数g(n)为合并子问题的开销)。

        在我看来,算法学习的曲线是相当陡峭和漫长的。这不仅仅体现在要理解每个具体的算法结构,更要理解分治与递归这些处于更底层的算法思想。倘若能明确其算法思想,理解动态规划也不在话下,而其他问题自然也迎刃而解了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

教你彻底学会动态规划——入门篇

动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙...
  • baidu_28312631
  • baidu_28312631
  • 2015年08月11日 13:26
  • 102022

教你彻底学会动态规划——进阶篇

在我的上一篇文章中已经详细讲解了动态规划的原理和如何使用动态规划解题。本篇文章,我将继续通过例子来让大家更加熟练地使用动态规划算法。     话不多说,来看如下例题,也是在动态规划里面遇到过的最频繁的...
  • baidu_28312631
  • baidu_28312631
  • 2015年08月11日 20:29
  • 8784

难以捉摸的动态规划

不知在你眼中,动态规划在众多算法中处于什么地位呢?是ACM比赛中不可或缺的技巧之一,又或者是征战POJ水题必备的利器?倘若果真如此,那我多少有些羡慕你,因为我至始至终都没有领悟动态规划的精髓。    ...
  • adaifire
  • adaifire
  • 2011年08月02日 13:32
  • 3409

动态规划为什么就是经典?

五大常用算法:动态规划算法
  • Code_star_one
  • Code_star_one
  • 2017年04月24日 16:52
  • 261

动态规划及其应用

1.动态规划概述1.1 什么是动态规划相信大家都遇到过这样一个问题:例题1  如图1,有一个有向图,图中有n层顶点,除了第n层以外,第i层与第i+1层之间有边。边上的数值代表两个顶点的距离。要求找一条...
  • lyflower
  • lyflower
  • 2008年03月01日 19:54
  • 4202

对动态规划问题的一些思考

HDOJ刷了一些DP问题,做些总结.
  • foryoundsc
  • foryoundsc
  • 2016年07月20日 23:29
  • 634

从零开始学动态规划

本文在写作过程中参考了大量资料,不能一一列举,还请见谅。 动态规划的定义: 动态规划是运筹学的一个分支,是求解决策过程的最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多...
  • qq_32400847
  • qq_32400847
  • 2016年04月24日 18:00
  • 9942

教你彻底学会动态规划——入门篇

动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙...
  • rock_joker
  • rock_joker
  • 2017年03月31日 18:21
  • 495

动态规划(1):基本思路以及步骤

基本思想动态规划是针对一类求最优解的问题的算法, 其核心是将一个问题分解成为若干个子问题(这里对应下文的子问题使用条件), 部分类似于分治的思想(不懂得可以参考归并排序), 通过求每一次的最优决策, ...
  • sun897949163
  • sun897949163
  • 2016年07月31日 11:05
  • 5386

动态规划总结与思考

这是一篇关于动态规划的思考文章,主要讲了我对动态规划的一些思考与总结。...
  • qiuzhijieluojianping
  • qiuzhijieluojianping
  • 2015年01月01日 10:57
  • 780
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:难以捉摸的动态规划
举报原因:
原因补充:

(最多只允许输入30个字)