怎样学习DP

转自http://wenku.baidu.com/link?url=1LTo6t_XsS2iFJBgi-QkRMZFfdNLNrDFeNvjLvoOgLVenzWU0u0jWELC-6G4pjuPLm4jTW3bm-BzYyo97BJu3DC1BIFbYpsUQ9DYF4BMkHq


怎样学好DP 

2009-09-12 17:32 

在信息学竞赛短暂的历史中,伴随着计算机科学领域的突飞猛进,算法和数据结构的难度和广度都不断地发展,从网络流、平衡树,新的算法和数据结构不断地被纳入大纲。动态规划无疑是其中一颗璀璨的明星,在信息学竞赛的舞台上绽放出夺目的光彩。IOI94《数字三角形》第一次将动态规划这个名词刻进了信息学竞赛的历史。NOI历史上的第一道动态规划题目出自NOI95的《石子归并》。自此之后,动态规划就一发而不可收拾,成为了近年来NOIPNOI以及IOI必需掌握的内容。然而,学生在学习动态规划时总是不得要领,没能发挥出动态规划对于解题产生的巨大魅力。下面,本人根据多年的教学经验,提几点有助于大家学好动态规划的意见,不当之处,希望大家批评指正。 

一、明确什么是动态规划

        动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求,创立了解决这类过程优化问题的新方法——动态规划。 

       以上的解释或许过于专业,在高中的信息学竞赛中,我们可以把动态规划理解为将一个问题的求解过程分为几个部分,并逐一求得最优值,从而得到全局最优值的方法。举个简单的例子来说明:

       假设我们要以最高的利润卖出某样物品,我们就可以把整个过程分为两个部分——进货和销售。如果能以最低的价格进货,以最高的价格出手。毫无疑问,我们便可以得到最高的利润。 

 

二、明确动态规划的条件 

       任何一个算法都有其局限性,同样,不是每一个问题都可以用动态规划解决的。关于动态规划的条件我们参考以下方奇在2000年国家集训队中的描述:

      1 最优化原理       

       最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。最优化原理是动态规划的基础,任何问题,如果失去了最优化原理的支持,就不可能用动态规划方法求解。

      无后效性

    “过去的步骤只能通过当前状态影响未来的发展,当前的状态是历史的总结”。这条特征说明动态规划只适用于解决当前决策与过去状态无关的问题。状态,出现在策略任何一个位置,它的地位相同,都可实施同样策略,这就是无后效性的内涵。 

      由上可知,最优化原理,无后效性,是动态规划必须符合的两个条件。

 

 三、理解一个概念 

       在分析出问题能用动态规划求解之后,实现动态规划的程序往往非常简洁,尤其是在写出状态和转移方程之后,实现起来非常容易。现在问题的关键就是找出问题的状态和转移方程。找出状态和转移方程,必须先理解一个概念:多阶段决策问题

       如果一类活动过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策(采取措),一个阶段的决策确定以后,常常影响到下一个阶段的决策,从而就完全确定了一个过程的活动路线,则称它为多阶段决策问题。个阶段的决策构成一个决策序列,称为一个策略。每一个阶段都有若干个决策可供选择,因而就有许多策略供我们选取,对应于一个策略可以确定活动的效果,这个效果可以用数量来确定。策略不同,效果也不同,多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下达到最好的效果。

       前文已经说过,动态规划相当于把一个问题划分成若干个部分,对于每个部分分别进行计算,然后得出全局最优情况。所以阶段就是我们划分成的部分,状态便是我们所进行到的部分,从一个状态经过一个阶段达到另一个阶段,我们就称作状态转移而在状态转移的过程中,我们常常有很多途径可以选择,这一个选择的过程就叫做决策

       以最长上升子序列为例。我们以已考虑的数字数来划分阶段,以F[i]表示以第i个数结尾的最长上升子序列长度来表示状态,由此可知,F[i]必定是由F[j]i-=>j>=1推出来的,若以num[i]表示第i个数的数值,则状态转移的条件便是num[i]>num[j],否则不满足上升序列的条件。于是我们得出了状态转移的方程:

      其中F[1]=1


四、重点研究几类经典问题

      在理解了动态规划的一些概念之后,要能做到用动态规划解题,其中重点研究几类经典问题是很有必要的。就近几年的比赛题目而言,往往都可以转化为我们已知的经典模型。下面介绍几个经典模型:

     1、按状态类型分

         编号(长度)动态规划类,题库:最长不下降子序列;拦截导弹(noip99);花店橱窗布置ioi99)。

         区间动态规划类,题库:石子合并;邮局(ioi2000)。

         坐标动态规划类,题库:棋盘分割(noi99)。

         数轴动态规划类,题库:01

         背包;装箱问题(noip01)。

         树型动态规划类,题库:选课(ctsc97),贪食的九头龙(noi02)。

         集合动态规划(状态压缩)类,题库:购物(ioi95)。

    2、按转移方式分

         存在性:01统计(ctsc99);Catalan划分问题:

         分割点有序类,题库:成绩最大(noip00 

         分割点无序类,题库:石子合并(noi95);加分二叉树(noip03);括号序列 

    3、路径问题:方格取数(noip00);花店橱窗布置(ioi99


    通过这些经典模型的研究,可以从多角度了解如何进行状态的划分,然后反复理解每一个转移方程的意义,在潜移默化之中,我们便可以达到动态规划的基本要求,做到以不变应万变。


五、专题练习

    在能用动态规划解决一些简单问题之后,我们需要做大量的专题练习,通过专题练习,来提高自己分析问题的能力,提高自己应用动态规划解题的能力,提高自己编程的熟练度从而使自己真正掌握到动态规划的精髓,使动态规划成为自己制胜的法宝。

你可能感兴趣的:(算法)