动态规划(1)

  动态规划算法是针对满足一些特殊条件的问题的一种算法。它通过把这个问题分解成若干个相似的小规模的问题,形成各个状态维度,然后对各状态进行分阶段、有顺序、无重复、决策性的遍历求解。
  这是个很重要的定义。它基本概括了所有动规问题的求解方式:把一个具体的问题抽象出一个用若干参数描述的状态,并且这个状态可以由一些子状态推导得出;接着找到从子状态推导到当前状态的方法;如果可以的话,再添加一些适当的优化;最后编程,把问题最终解决。
  当然,不是所有的问题都可以用动规算法解决。正如开头定义所说,动规算法是“针对满足一些特殊条件的问题”的。这些“特殊条件”,总的来说有两个:最优子结构性质和无后效性。再解释这两个条件之前,还需要说明以下三个概念:阶段、状态和决策。其中状态就是上一段我说的,由若干参数描述的状态。如果对递推有了解的话,那么“决策”这个概念也比较好理解,就是递推的“递归方程”。只是在动规当中,当前状态往往还需要在若干个子状态中进行抉择,选出最好的子状态,这里就有了“决策”的意思,所以“决策”对应了动规当中的“转移方程”。最难理解的可能就是“阶段”了。形式化的说,“阶段”就是一些“状态”的集合。但究竟是哪些状态的集合?为了更形象的说明这点,我需要从图论的角度去解释这个概念。

  如上图,描述了一个动态规划算法遍历状态的一般过程,其中点(即图中的圆圈)表示状态,有向边表示“决策”,即动规的转移方程(请无视图下方的英文,这是我从神经网络找到的图,但这个图也能很好的描述动规)。从有向图边箭头的方向可以看出,整个动规大致是从左向右进行的,所以最左边是初始状态,最右边是最终状态。另外,图中有部分点被一个方框框住(例如“hidden layer 1”中的四个点)。这些点彼此之间没有边相连,却分别和左边的部分点和右边的部分点有边相连。这样的点的集合,就是刚才所说的“阶段”。“阶段”这个概念很重要,因为它可以反映动规算法从初始状态到最终状态遍历过程的大致方向。因此,在我们描述状态时,一定有一个参数是代表“阶段”的(否则动规就失去了其“有顺序性”)。
  再理解了“状态”、“决策”和“阶段”三个概念后,下面再解释一下动规两个重要性质:最优子结构性质和无后效性。
  最优子结构性质,狭义的理解就是当前状态的最优解一定是从前面各阶段子状态的最优解导出。广义的来看,“最优子结构性质”其实说明了这一点:动态规划在阶段计算完成时,只会在每个阶段保留与最终解集相关的部分代表信息,这些代表信息在后续阶段计算中应当可以被重复利用,这样动态规划对状态的抽象和子问题的重叠递进才能起到优化作用。反之,如果一个问题不能被拆解成若干子问题或者子问题对当前问题的推导没有作用,那么这个问题就不满足“最优子结构性质”,从而不能用动态规划求解。
  无后效性,形象的说就是当前状态不能受到“未来状态”的影响,只能由“过去的子状态”推导得出。从图论的角度来看,动态规划对状态空间的遍历形成一张有向无环图,遍历顺序就是该有向无环图的一个拓扑序(如果不了解“拓扑”这个概念可以自行百度)。正如上面放的那张图一样,如果按照上图箭头的顺序从左到右遍历各节点,是不会出现环的,即一个节点不会被访问两次及以上。当然,如果一个问题不满足这个这个性质,自然也不能直接用动规求解(不过有的问题可以间接用动规)。
  以上就是对动态规划这个算法的大致阐述。动规问题在ACM中通常都是比较难的一类问题,其难点主要在对问题状态的描述以及对动规的优化。但正所谓“熟能生巧”,如果动规问题做得多的话,还是可以发现解决动规问题的一些套路,这些套路对我们解决动规问题帮助很大。接下来的几篇博客我会按照以下的思路,并结合一些经典例题,具体的阐述我在解决动规问题时发现的一些套路:首先是线性动规,包括经典的背包问题和区间dp问题;其次是树形dp;最后是动规的优化,主要分为对状态的优化和对转移方程的优化。当然,动规问题还有很多其他的东西,比如计数dp,概率dp等,因为之前我没有深入研究其余的动规问题,所以这里也就不对这些动规问题做过多阐述,感兴趣的可以自行去网上了解。
  另外,李煜东的《算法竞赛进阶指南》在我学习动规过程中帮助很大,这里也强烈安利给大家,希望能对各位的学习起到帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值