收藏 分享(赏)

动态规划 李天騻.ppt

上传人:hwpkd79526 文档编号:10102797 上传时间:2019-10-10 格式:PPT 页数:36 大小:1.48MB
下载 相关 举报
动态规划 李天騻.ppt_第1页
第1页 / 共36页
动态规划 李天騻.ppt_第2页
第2页 / 共36页
动态规划 李天騻.ppt_第3页
第3页 / 共36页
动态规划 李天騻.ppt_第4页
第4页 / 共36页
动态规划 李天騻.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、动态规划简介,几种常见方程与若干经典问题ACM基地 李天騻,引入问题:求最短路径,Dijkstra算法优点:适用性强,适用于所有图缺点:效率低,时间复杂度为O(N*N)出于本题的特殊性,我们可以采用动态规划思想特殊性:可分为五个阶段动态规划方程:如果用fi表示到达第i个节点的最短路径长度,则fi=minfi,fj+vi,j其中j表示i的前一个结点,vi,j中存放边的长度,动态规划的历史,动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究 多阶段决策

2、过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法动态规划。1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。,什么情况能使用动态规划,动态规划与分治法类似,也是要将 要求解的问题逐层分解成一级一级、规模逐步缩小的子问题,直到可以直接求出其解的子问题为止。分解成的所有子问题按照层次关系构成一棵子问题树。树根是原问题。原问题的解依赖于子问题树中所有子问题的解。简单所来:动态规划就是一

3、类大问题最优解包含子问题最优解的问题。,动态规划词汇解释,最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。,无后效性 将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。,动态规划的优势,动态规划常常以其特殊的策略解决过程大大优化搜索的

4、时间复杂度,降低数量级。相比之下,一般的搜索技术,对于某个子问题,不管是否已经解决过,只要遇上,就会再次对它求解,因而影响了解题的效率,而动态规划则是很好的利用了已经求解过的结果,利用这些结果缩短当前的最优解搜索次数,因此,很多情况下动态规划是一种以空间换时间的算法。,动态规划的使用条件与步骤,条件:同时满足最优子结构性质与无后向性。 步骤: (1)选择适当的问题状态表示,并分析最优解的性质 (2)递归地定义最优值(即建立递归方程或状态转移方程) (3)以自底向上的方式计算出最优值 (4)根据计算最优值时得到的信息,构造一个最优解 步骤(1)(3)是动态规划算法的基本步骤。在只需要求出最优值的

5、情形,步骤(4)可以省略。若要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤(3) 中计算最优值是,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速地构造出一个最优解。,例:01背包 题目描述:,有N件物品和一个容量为V的背包。第i件物品的重量是vi,价值为wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且放入的价值最大。,基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即fiv表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:fiv=maxfi-1v,fi-1v-ci+wi。

6、,注意fiv有意义当且仅当存在一个前i件物品的子集,其费用总和为v。所以按照这个方程递推完毕后,最终的答案并不一定是fN V,而是fN0V的最大值。如果将状态的定义中的“恰”字去掉,在转移方程中就要再加入一项fiv-1,这样就可以保证fN V就是最后的答案。至于为什么这样就可以,由你自己来体会了。,优化空间复杂度,以上方法的时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V)。 先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1N,每次算出来二维数组fi0V的所有值。那么,如果只用一个数组f 0V,能不能保证第i次循环结束后fv中表示的就

7、是我们定义的状态fiv呢?fiv是由fi-1v和fi-1 v-ci两个子问题递推而来,能否保证在推fiv时(也即在第i次主循环中推fv时)能够得到fi-1v和fi-1v -ci的值呢?事实上,这要求在每次主循环中我们以v=V0的顺序推fv,这样才能保证推fv时fv-ci保存的是状态fi -1v-ci的值。,for i=1N for v=V0 fv=maxfv,fv-ci+wi; 其中的fv=maxfv,fv-ci一句恰就相当于我们的转移方程fiv=maxfi-1v,fi- 1v-ci,因为现在的fv-ci就相当于原来的fi-1v-ci。如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了fi

8、v由fiv-ci推知,与本题意不符,但它却是另一个重要的背包问题P02最简捷的解决方案,故学习只用一维数组解01背包问题是十分必要的。 Vijos p1104就是一道基于背包的题目,感兴趣的同学可以去自己练一下,例:方格取数 题目描述: 某人从方格(如下图)左上角出发要走到右下角,每次只能走到右边或者是下方的相邻方格之中(如在第三行第二列0格只能走到第三行第三列的2格或者是第四行第二列的1格),设经过一个方格就获得方格内数的值,问这个人能取到的最大的数值和是多少?,分析:这个问题我们很容易得到如下结论:若路线经过当前方格,则路线必然经过其左边方格和上边的方格,换句话说,路线走到当前方格的最优值

9、是左边方格和上边方格最优值中较优的那个加上当前方格的值,于是我们很容易就的得到动态规划方程: Di,j=maxDi-1,j,Di,j-1+numi,j(1in,1jm) Di,j初始值为当前方格的数值,初始情况下将D0,j和Di,0初始值赋为0,这样Dn,m就是我们要的值。,例:数字三角形问题(PKU 1163)问题描述:给定一个具有N层的数字三角形,从顶至底有多条路径,每一步可沿左斜线向下或沿右斜线向下,路径所经过的数字自核为路径得分,请求出最小路径得分。 样例三角形: 变形后:2 26 2 6 21 8 4 1 8 4 1 5 6 8 1 5 6 8,分析:将三角形靠左对齐变形,我们可以采

10、用动态规划,假设到Di,j表示第i行j列的最小路径得分,我们先把数字三角形读入数组D,然后我们很容易就得到动态规划方程: Di,j=minDi-1,j-1,Di-1,j+Di,j(0in,1ji),其中si,j是数字三角形第i行j列的值,不存在的定义为无穷大。 这样,我们就可以用两重for循环计算Di,j的值,然后求出Dn,j的最小值就是我们所求的最优解,当然为了求路径可附加上记录Di-1,j-1和Di-1,j哪个取得小值,就能得到路径。,例:滑雪 (PKU 1088),Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而

11、且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-.-3-2-1更长。事实上,这是最长的一条。,Input输入的第一行表示区域的行数R和列数C(1 = R,C = 100)。下面是R行,每行有C个整数,代表高

12、度h,0=h=10000。 Output输出最长区域的长度。 Sample Input5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9Sample Output25,分析:1.搜索(时间效率?)2.DP 设hgti,j表示以(i,j)为起点能获得的最长雪道,则hgti,j=maxhgti1,j1+1 其中(i1,j1)表示与(i,j)相邻的节点且numi1,j1numi,j,效果截图,记忆化搜索,记忆化+DP,例:放苹果 (PKU 1664),Description把M个同样的苹果放在N个同样的盘子里,允

13、许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input第一行是测试数据的数目t(0 = t = 20)。以下每行均包含二个整数M和N,以空格分开。1=M,N=10。 Output对输入的每组数据M和N,用一行输出相应的K。 Sample Input1 7 3 Sample Output8,分析:,搜索:可应付如本题般数据规模较小的情况,可如果题目中N=200?DP:f(m, n): 把m个苹果放到n个盘子中的方法数 f(m, n-1): 把m个苹果放到n-1个盘子中的方法数(其中至少有一个空盘子)f(m-n, n): 把m个苹果放到n个盘子中

14、,而且每个盘子中都有苹果(先拿n个出来,等m-n个放好了,然后每个盘子放一个,int ans,n,m; int dp(int m,int n) if(mt;for(int i=0;imn;ans=dp(m,n);coutansendl; ,例:整数划分 (NUAA 1349)描述将整数n分成k份,且每份不能为空,任意两份不能相同 (不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的: 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输入输入n,k (6n=200,2=k=6) 输出一个整数,即不同的分法。 样例输入 6 3 样例输出 3,思考:此题和分苹果问题有

15、何异同?,此题和放苹果题唯一不同的地方是:此题中每份不能为空,而放苹果题中允许有空盘子而“每份不能为空”的等价命题是“每份至少为1”我们可以先从n中取出k个数来分给k分,这样剩下n-k个数就可以“随便放”了。如此,整数划分问题就可以转换为放苹果问题,最长不下降子序列(LIS),导弹拦截 (NUAA 1005) 描述某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞

16、来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。,输入输入一组测试数据,含有多个(个数=20个)30000以内的正整数,表示导弹的高度。以文件末尾结束。 输出输出包括两行,依次表示最多能拦截的导弹数和要拦截所有导弹最少要配备的系统数。 样例输入389 207 155 300 299 170 158 65 样例输出6 2,要求最多拦截的导弹数,就是求最长不上升序列。 设dpi表示i以前的最长不上升序列,状态转移方程: dpi=dpj+1 (hj=hi)(0=ji) 要求最少配备的系统数,就是求最长不上升

17、序列的最小分划。 我们可以证明它等于最长上升序列的长度,证明略。,最长公共子序列 (LCS),Common Subsequence (PKU 1458) DescriptionA subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = another sequence Z = is a subsequence of X if there exists a strictly increasing sequence

18、of indices of X such that for all j = 1,2,.,k, xij = zj. For example, Z = is a subsequence of X = with index sequence . Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.,InputThe program input is from the std input. Each data set in th

19、e input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct. OutputFor each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separ

20、ate line. Sample Inputabcfbc abfcab programming contestabcd mnpSample Output4 20,令序列A=a1a2.an,B=b1b2bm.记Ak=a1a2.ak为序列A中最前面连续k个字符的子序列。容易看到,序列A和B的最长公共子序列,有如下性质: (1)若an=bm,序列Sk=c1c2ck是序列A和B的长度为k的最长公共子序列,则必有an=bm=ck,且序列Sk-1=c1c2.ck-1是序列An-1和Bm-1的长度为k-1的最长公共子序列 (2)若an!=bm,且an!=ck,则序列Sk=c1c2ck是序列An-1和序列Bm

21、的长度为k的最长公共子序列 (3)若an!=bm且bm!=ck,则序列Sk=c1c2ck是序列A和序列Bm-1的长度为k 的最长公共子序列,设a,b为两个字符串数组,dpi,j表示a中前i个字符和b中前j个字符的最长公共字串长度,则dpi,j=maxdpi,j-1,dpi-1,j,dpi-1j-1+1(ai=bj),#include using namespace std;const int MAX=500;int max(int a,int b) return (ab)? a:b; int main() char aMAX,bMAX;while(scanf(“%s%s“,a,b)!=EOF)

22、int dpMAXMAX=0;for(int i=1;i=strlen(a);i+)for(int j=1;j=strlen(b);j+)dpij=max(dpi-1j,dpij-1);if(ai-1=bj-1) dpij=max(dpij,dpi-1j-1+1);printf(“%dn“,dpstrlen(a)strlen(b); return 0; ,小结,我们大体讲述了动态规划的原理与常见方程以及滚动数组这一工具,但是任何一种算法的掌握都不是一两次学习能够完成的,必须通过不断的实践,多做题,动态规划也不例外。要想很好的掌握动态规划,就必须多做题,多思考,通过不断的思索、创新寻求更好的时间和空间效率,日积月累,才能很好的掌握这种算法,有兴趣的同学可以去各大OJ上找找关于动态规划的习题,多多练习,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报