信息学奥赛中的动态规划教学课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《信息学奥赛中的动态规划教学课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息学 中的 动态 规划 教学 课件
- 资源描述:
-
1、1数字三角形IOI19942l 题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值最大。l 输入描述 Input Description 第一行是数塔层数N(1=N=100)。第二行起,按数塔图形,有一个或多个的整数,表示该层节点的值,共有N行。l 输出描述 Output Description 输出最大值。l 样例输入 Sample Input 5 13 11 8 12 7266 14 15 812 7 13 24 11l 样例输出 Sample Output 863解法1:暴搜DFS一遍遍历整
2、个数字三角形,对于每个节点,我们有2个选择,那么,n层的数字三角形有2n种可能,所以时间复杂度为O(2n)T L E!4解法2:贪心一路下去只找最大的可以吗?W A!5解法3:最长路将整个数字三角形看作一个由点和边组成的图,以a11为起点,求它到ani(1=i=n)的最长路Dijkstra算法:本题部分数据有负值SPFA算法:O(kM)的话应该能行Bellman-Ford算法:O(VE)有点危险啊Floyd算法:O(n3)你确定要用吗?方法可行但是打起来好麻烦6还有什么更好的算法吗?当然有!那就是本课要讲的内容动态规划7分析这个数字三角形,我们可以发现:一个节点只会受到上面两个节点的值的影响,
3、而上面节点的值也只会受到更加上面的节点的值的影响由此可写出递归式dpij=max(dpi-1j,dpi-1j-1)+aij上面这个递归式在动态规划中被叫做状态转移方程式,根据这个式子,我们可以从dp11开始递推,直到数字三角形的最后一行。时间复杂度O(n2),完全无压力8动态规划是优美的动态规划是神奇的动态规划是有趣的动态规划是简单的动态规划是卡骗分的动态规划是禁贪心的动态规划是防止爆0 的动态规划最简单最好玩了我最喜欢动态规划了!什么鬼!90-1背包问题Merkel and Hellman 1978NOIP2005普及组10题目描述Description由于该题目的题目描述版本过多,不再描述
4、输入描述InputDescription输入第一行有两个整数T(1=T=1000)和M(1=M=100),用一个空格隔开,T代表最大重量,M代表物品的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某个物品的时间和每个物品的价值。输出描述OutputDescription输出包括一行,这一行只包含一个整数,表示在不超过规定重量的情况下,可以拿到的最大价值。样例输入SampleInput1 11 1样例输出SampleOutput1数据范围及提示DataSize&Hint【数据规模】对于30%的数据,M=10;对于全部的数据,M=100。11老规矩:暴搜TLE
5、贪心一定WA最短路你可以试试怎么办?12动态规划才是王道!我们先分析下暴搜的过程:我们对每个物品进行了搜索,产生了大量的状态,每个状态包括三个要点:1.目前已用的背包的容量,这个不用多说2.目前已经获得的价值,这个也不用多说3.目前已经处理了多少物品,记录下已经处理物品数量的原因是由于每个物品只能拿一个,所以要记录下已经处理了多少物品,防止以后重复处理有什么想法没?13为什么不记录下相同的状态时的最优策略呢?14在使用相同的容量和处理了相同的物品后,剩下的搜索过程应该是相同的,假如共有n个物品,我们已经处理了m个,那么还需要处理的物品数量就是n-m,但是在背包剩余体积为v的情况下,剩下n-m个
6、物品产生的最优解应该是相同的,这样就可以简化搜索过程,但是前面的怎么办呢?前面的当然要最好的!于是,我们得到一条结论:在其他状态均相同的情况下,选择最好的总是对的!所以,我们可以开始优化这个搜索了:每次搜索到一个状态,就从之前搜到过的状态里找一遍,如果看见可以替换的状态就更新众:你不觉得更慢了么所以,怎么办呢?15你还记的桶排序吗?直接用数组下标记录,时间复杂度O(1)这个可以这样做吗?没问题!看数据范围:1=T=1000,1=M=100,状态只需要记录下重量和已处理的物品数,空间复杂度O(TM),128MB内存没问题至于状态转移方程式的话:dpij=max(dpi-1j,dpi-1j-vi+
7、ci)我一般习惯写成:dpi+1j=max(dpij,dpi+1j)dpi+1j+vi=max(dpi+1j+vi,dpij+ci)这个看个人喜好就可以了,没有强制要求的处理时,只要for一遍,把数组填充好就可以啦,时间复杂度O(TM)P.S.:这字母是谁规定的,这么恶心16如果卡你空间怎么办?17滚蛋动数组你还记得斐波那契问题怎么做的吗?c=a+b a=b b=c根本不用开一个数组嘛!这个问题也一样,除了前一行,其他的状态根本就用不到嘛!那么:18也就是说,数组只留2行就可以了,每处理完一行,就把第二行的结果放回第一行,继续处理滚动数组是用时间换空间的一种策略有没有更好的方法呢?19背包问题
8、可以用一维数组解决你造吗?由于重量没有负数,所以可以直接向后转移,而且不用向下转移了,但这样就有可能重复处理一个物品,怎么办?很简单,改变下方向,从后往前处理就可以啦至此,01背包完满完成20难度增加的背包问题更加喜(sang)闻(xin)乐(bing)见(kuang)的背包问题21超大背包问题每个物品只能拿一次,物品数量M=100,背包容量T=109,每个物品的价值=100,每个物品的重量=109由于本题物品的价值非常小,所以可以将dp数组改为由已处理的物品数量和价值,数组内存储内容改为当前所需的重量即可22二维背包问题对于每个物品,分别有体积v和重量w,求体积和重量均不超标的情况下可以拿到
9、的最大价值维数改为三维,改变下转移,也可简化为二维,从后往前for得出正确答案23完全背包问题每个物品可以拿无限次,只要不超过最大重量即可24思路1:背包+枚举在状态转移时枚举每个物品可以拿的次数,时间复杂度O(VNK)25优化1:减少物品种类对于一个物品来说,假如它的重量大于等于另一个物品且它的价值比另一个物品低,那么要它何用?可以直接省略掉该物品,所以只要先预对所有物品进行一遍O(n2)的预处理,就能带来很大的优化26优化2:转化为0-1背包将一个物品看成多个物品,时间复杂度没有发生变化但是大家记得一个叫做鬼谷子的钱袋的题吗?如一个物品最多可以拿10个,则可以拆分成:1个该物品,2个该物品
10、,3个该物品,4个该物品,达到log(k)的级别,也是个不错的优化27思路2:用一维背包解决大家还记得一维的背包解决方案吗?此题也可,只不过为了使一个物品可以重复计算,只需要将从后往前改为从前往后即可,时间复杂度O(VN)28多重背包问题对于每个物品,可以拿不同的次数,如:有的1次,有的10次,有的100次依然采取之前的二进制思想,简化问题29混合背包问题对于一个背包问题,有多种物品可以选择:有只能拿一件的,有可以拿多个的,有可以无限拿的,这时候应该怎么办?30这个问题综合了三种背包,代表这个问题可以使用各种背包问题的优化方法!31优化1采用完全背包问题的优化方式1,即可瞬间去除大量无用物品P
11、.S.:简直就是个垃圾清理器32优化2先不考虑多重背包,只考虑01背包和完全背包,那么,就可以用喜闻乐见的一维数组方法求解,只要在转移前判断下是从前往后还是从后往前转移就行了,那么多重背包怎么办?笨!用二进制转成多个01背包啊!33金明的预算方案(NOIP2006提高组)主件主件附件附件电脑打印机,扫描打印机,扫描仪仪书柜图书图书书桌台灯,文具台灯,文具工作椅 无无题目描述Description金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明
12、就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,右图就是一些主件与附件的例子。如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数15表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是10元的整数倍)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。设第j件物品的价格为vj,重要度为wj,共选中了k件物品,编号依次为j1,j2,jk,则所求的总和为:vj1*w
13、j1+vj2*wj2+vjk*wjk。(其中*为乘号)请你帮助金明设计一个满足要求的购物单。34输入描述InputDescription第1行,为两个正整数,用一个空格隔开:N m(其中N(32000)表示总钱数,m(60)为希望购买物品的个数。)从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数v p q(其中v表示该物品的价格(v0,表示该物品为附件,q是所属主件的编号)输出描述OutputDescription只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(200000)样例输入SampleInput1000 5800 2 0 400
14、 5 1300 5 1400 3 0500 2 0样例输出SampleOutput2200数据范围及提示DataSize&Hint无35对于每个主件,它最多有2个附件,那么每个物品只有这几种情况:1.不带附件2.带附件A3.带附件B4.带附件A和B5.连主件都不拿那么只要在状态转移时枚举每个物品拿还是不拿,拿几个附件即可不过好好看看还是能发现些什么的:这题放眼望去应该是个树形dp,好可怕的说36至此,背包问题全部完成!但这仅仅是简单的背包问题而已37区间型DP别看我看标题38石子归并经典区间型dp39题目描述 Description有n堆石子排成一列,每堆石子有一个重量wi,每次合并可以合并相
15、邻的两堆石子,一次合并的代价为两堆石子的重量和wi+wi+1。问安排怎样的合并顺序,能够使得总合并代价达到最小。输入描述 Input Description第一行一个整数n(n=100)第二行n个整数w1,w2.wn (wi=100)输出描述 Output Description一个整数表示最小合并代价样例输入 Sample Input44 1 1 4样例输出 Sample Output18数据范围及提示 Data Size&Hint无40分析下花费吧花费是由两堆石子组成的,即:costij=wi+wi+1+wj-1+wj要合并i-j堆,必须要先合并ik堆和k+1j堆,可以得出递推式 js(i
16、,j)=wi i=j min(js(i,i)+js(i+1,j)js(i,j-1)+js(j,j)+costijij41然后怎么办?递归处理吗?我说你百分百超时你信吗?这节课学的啥?动态规划啊!开个数组,记录下来,直接转成递推,时间复杂度O(n2),完全无压力P.S.:这个题写代码还是稍微有点难度的,所以写不出来的童鞋可以考虑放(mei)弃(tian)本(yi)题(bian)42能量项链(noip2006)题目描述 Description在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的
17、两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为m*r*n(Mars单位),新产生的珠子的头标记为m,尾标记为n。需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。例如:设N=4,4颗珠子的头标记与尾标记依次为(2,3)(3
18、,5)(5,10)(10,2)。我们用记号 表示两颗珠子的聚合操作,(j k)表示第j,k两颗珠子聚合后所释放的能量。则第4、1两颗珠子聚合后释放的能量为:(4 1)=10*2*3=60暂时找不到能量项链这种高级玩意儿,拿这个代替下吧43这一串项链可以得到最优值的一个聚合顺序所释放的总能量为(4 1)2)3)=10*2*3+10*3*5+10*5*10=710输出描述 Output Description只有一行,是一个正整数E(E2.1*109),为一个最优聚合顺序所释放的总能量。样例输入 Sample Input42 3 5 10样例输出 Sample Output710数据范围及提示 D
19、ata Size&Hint无44众所皆知,丝带项链是环形的,也就是说,这个题相比起石子归并问题来说,变成了环形摆放,怎么办呢poi?用脑子想一想,可以想出:即使是一个环合并,也不会合并超过2圈也就是说,可以把这串项链看作2倍长,读入时就进行预处理,之后合并时只要找出在其中一点断开能得到的项链的最大能量值就可以了45乘积最大NOIP200046题目描述 Description今年是国际数学联盟确定的“2000世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的
20、选手出了这样一道题目:设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:有一个数字串:312,当N=3,K=1时会有以下两种分法:1)3*12=362)31*2=62这时,符合题目要求的结果是:31*2=62 现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。输入描述 Input Description 程序的输入共有两行:第一行共有2个自然数N,K(6N40,1K6)第二行是一个长度为N的数字串。47输出描述 Output Description 结果显
21、示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数)。样例输入 Sample Input4 21231样例输出 Sample Output62数据范围及提示 Data Size&Hint本题由于比较老,数据实际也比较小,用long long 即可通过48这个题目要求用指定的乘号数量分开一个数,将它变得尽可能大,先找递推式:aijk=max(aiik-1*ai+1jk-1aij-1k-1*ajjk-1)aijk的含义为:从i到j段,使用了k个乘号所产生的最大乘积,还可以简化为aik,含义为从1到i段使用了k个乘号所产生的最大乘积记录到dp数组里进行动态规划就好了49数的划分(NOIP20
22、01)题目描述 Description将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。例如:n=7,k=3,下面三种划分方案被认为是相同的。1 1 51 5 15 1 1问有多少种不同的分法。50输入描述 Input Description输入:n,k(6n=200,2=k=6)输出描述 Output Description输出:一个整数,即不同的分法。样例输入 Sample Input 7 3样例输出 Sample Output4数据范围及提示 Data Size&Hint 四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;51这个题目需要让人感到猎奇(不
展开阅读全文