动态规划经典教程.doc

上传人:pu****.1 文档编号:562967446 上传时间:2024-01-05 格式:DOC 页数:45 大小:464.51KB
返回 下载 相关 举报
动态规划经典教程.doc_第1页
第1页 / 共45页
动态规划经典教程.doc_第2页
第2页 / 共45页
动态规划经典教程.doc_第3页
第3页 / 共45页
动态规划经典教程.doc_第4页
第4页 / 共45页
动态规划经典教程.doc_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《动态规划经典教程.doc》由会员分享,可在线阅读,更多相关《动态规划经典教程.doc(45页珍藏版)》请在金锄头文库上搜索。

1、动态规划经典教程引言:本人在做过一些题目后对DP有些感想,就写了这个总结:第一节 动态规划基本概念一,动态规划三要素:阶段,状态,决策。他们的概念到处都是,我就不多说了,我只说说我对他们的理解:如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线。每个状态间又有关联(下一个状态是由上一个状态做了某个决策后产生的)。下面举个例子:要生产一批雪糕,在这个过程中要分好多环节:购买牛奶,对牛奶提纯处理,放入工厂加工,加工后的商品要包装,包装后就去销

2、售,这样没个环节就可以看做是一个阶段;产品在不同的时候有不同的状态,刚开始时只是白白的牛奶,进入生产后做成了各种造型,从冷冻库拿出来后就变成雪糕(由液态变成固态=_=|)。每个形态就是一个状态,那从液态变成固态经过了冰冻这一操作,这个操作就是一个决策。一个状态经过一个决策变成了另外一个状态,这个过程就是状态转移,用来描述状态转移的方程就是状态转移方程。经过这个例子相信大家对动态规划有所了解了吧。下面在说说我对动态规划的另外一个理解:用图论知识理解动态规划:把动态规划中的状态抽象成一个点,在有直接关联的状态间连一条有向边,状态转移的代价就是边上的权。这样就形成了一个有向无环图AOE网(为什么无环

3、呢?往下看)。对这个图进行拓扑排序,删除一个边后同时出现入度为0的状态在同一阶段。这样对图求最优路径就是动态规划问题的求解。二,动态规划的适用范围动态规划用于解决多阶段决策最优化问题,但是不是所有的最优化问题都可以用动态规划解答呢?一般在题目中出现求最优解的问题就要考虑动态规划了,但是否可以用还要满足两个条件:最优子结构(最优化原理)无后效性最优化原理在下面的最短路径问题中有详细的解答;什么是无后效性呢?就是说在状态i求解时用到状态j而状态j就解有用到状态k.状态N。而求状态N时有用到了状态i这样求解状态的过程形成了环就没法用动态规划解答了,这也是上面用图论理解动态规划中形成的图无环的原因。也

4、就是说当前状态是前面状态的完美总结,现在与过去无关。当然,有是换一个划分状态或阶段的方法就满足无后效性了,这样的问题仍然可以用动态规划解。三,动态规划解决问题的一般思路。拿到多阶段决策最优化问题后,第一步要判断这个问题是否可以用动态规划解决,如果不能就要考虑搜索或贪心了。当却定问题可以用动态规划后,就要用下面介绍的方法解决问题了:(1)模型匹配法:最先考虑的就是这个方法了。挖掘问题的本质,如果发现问题是自己熟悉的某个基本的模型,就直接套用,但要小心其中的一些小的变动,现在考题办都是基本模型的变形套用时要小心条件,三思而后行。这些基本模型在先面的分类中将一一介绍。(2)三要素法仔细分析问题尝试着

5、确定动态规划的三要素,不同问题的却定方向不同:先确定阶段的问题:数塔问题,和走路问题(详见解题报告)先确定状态的问题:大多数都是先确定状态的。先确定决策的问题:背包问题。(详见解题报告)一般都是先从比较明显的地方入手,至于怎么知道哪个明显就是经验问题了,多做题就会发现。(3)寻找规律法:这个方法很简单,耐心推几组数据后,看他们的规律,总结规律间的共性,有点贪心的意思。(4)边界条件法找到问题的边界条件,然后考虑边界条件与它的领接状态之间的关系。这个方法也很起效。(5)放宽约束和增加约束这个思想是在陈启锋的论文里看到的,具体内容就是给问题增加一些条件或删除一些条件使问题变的清晰。第二节 动态规划

6、分类讨论这里用状态维数对动态规划进行了分类:1.状态是一维的11下降/非降子序列问题:问题描述: 挖掘题目的本质,一但抽象成这样的描述就可以用这个方法解在一个无序的序列a1,a2,a3,a4an里,找到一个最长的序列满足:ai=aj=ak=am,且ijkajakam,且ijkm.(最长下降子序列)。问题分析:如果前i-1个数中用到ak (akai或akai(或aj=ai),optj+1就是opti的值;用方程表示为:我习惯了这种写法,但不是状态转移方程的标准写法 opti=max(optj)+1 (0=ji 且aj=ai) 最长非降子序列opti=max(optj)+1 (0=jai) 最长下

7、降子序列实现求解的部分代码:opt0:=maxsize;maxsize 为maxlongint或-maxlongintfor i:=1 to n dofor j:=0 to i-1 doif ( ajai) and (optj+1opti) thenopti:=optj+1;ans:=-maxlongint;for i:=1 to n doif optians then ans:=opti; ans 为最终解复杂度:从上面的实现不难看出时间复杂度为O(N2),空间复杂度O(N);例题1 拦截导弹 (missile.pas/c/cpp) 来源:NOIP1999(提高组) 第一题【问题描述】某国为

8、了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。【输入文件】missile.in单独一行列出导弹依次飞来的高度。【输出文件】missile.out两行,分别是最多能拦截的导弹数,要拦截所有导弹最少要配备的系统数【输入样例】389

9、207 155 300 299 170 158 65【输出样例】62【问题分析】有经验的选手不难看出这是一个求最长非升子序列问题,显然标准算法是动态规划。以导弹依次飞来的顺序为阶段,设计状态opti表示前i个导弹中拦截了导弹i可以拦截最多能拦截到的导弹的个数。状态转移方程:opti=max(optj)+1 (hi=hj,0=j=ai) and (optj+1opti) thenopti:=optj+1;anslen:=0;for i:=1 to n doif optianslen thenanslen:=opti;fillchar(opt,sizeof(opt),0);a0:=-maxlong

10、int;for i:=1 to n dofor j:=i-1 downto 0 doif (ajopti) thenopti:=optj+1;anstime:=0;for i:=1 to n doif optianstime thenanstime:=opti;end;procedure print;beginwriteln(anslen);writeln(anstime);close(input);close(output);end;begininit;main;print;end.例题二 合唱队形 (chorus.pas/c/cpp) 来源:NOIP2004(提高组) 第一题N位同学站成一

11、排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,K,他们的身高分别为T1,T2,TK,则他们的身高满足T1.Ti+1TK(1=i=K)。你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。【输入文件】 输入文件chorus.in的第一行是一个整数N(2=N=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130=Ti=230)是第i位同学的身高(厘米)。【输出文件】 输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。【样例输入】8186 186 150 200 160 130 197 220【样例输出】4【数据规模】对于50的数据,保证有n=20;对于全部的数据,保证有n=100。【问题分析】出列人数最少,也就是说留的人最多,也就是序列最长。这样分析就是典型的最长下降子序列问题。只要枚举每一个人站中间时可以的到的最优解。显然它就等于,包括他

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号