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