《《noip教程动态规划》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《noip教程动态规划》PPT课件.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、动态规划陈爽为了解决一类最优化问题通过求得所有子问题的最优解来得到最终问题的最优解动态规划状态状态转移方程初始条件动态规划的基本要素线性动态规划区间动态规划状态压缩动态规划树形动态规划动态规划的分类状态是一维的Fi 由 Fj(ji)得到初始条件 F0 或 F1Part 1 线性动态规划设有整数序列b1,b2,b3,bm,若存在下标i1i2i3 in,且bi1bi2bi3 bin,则称 b1,b2,b3,bm中有长度为n的上升序列bi1,bi2,bi3,bin。求最长上升序列的长度N求长度为N的上升序列的个数求本质不同的长度为N的上升序列的个数N=1000例1.最长上升序列状态:Fi表示以bi结
2、尾的最长上升序列长度转移方程:Fi=max(Fj+1),jI,bjbi初始条件:Fi=1,1=iBj初始条件:Ti=1Solution本质不同?Orderi表示Bi在序列B中是第几大的Ti=sigma(Tj),当某个orderj1=orderj2时,只累加一个时间复杂度:O(N2)空间复杂度:O(N)SolutionPi 表示上身序列长度为i的序列末尾元素的最小值当计算Fi时,二分j,满足PjBiFi=Fj+1PFi=min(PFi,Bi)时间复杂度:O(NlogN)LIS O(NlogN)算法考虑一个由N个整数构成的数列,其中1到N都在数列中出现了恰好一次。在这个数列中从左到右任取两个数,如
3、果前者比后者大,那么这对数就是一个逆序对。而整个数列的逆序数就是其中所有逆序对的总数。例如,数列(1,4,3,2)的逆序数为3,因为存在三个逆序对:(4,3),(4,2)和(3,2)。写一个程序,计算有多少长度为N的这种数列,使它的逆序数恰为C。N=1000,C=10000例2.zbrka状态:Fij表示1i的一个排列,逆序对数目为j的方案数枚举1的位置Fij=sigma(Fi-1j-k),0=k=i-1时间复杂度:O(N*N*C)空间复杂度:O(N*C)SolutionFij=Fij-1+Fi-1j-Fi-1j-i第i阶段只与第i-1阶段有关滚动数组,省掉一维时间复杂度:O(N*C)空间复杂
4、度:O(C)Solution如图,已知一个有向图,求一条从最左边的点走到如图,已知一个有向图,求一条从最左边的点走到最右边点的方案(只能从左往右走),使得所经过最右边点的方案(只能从左往右走),使得所经过的权值和除以的权值和除以4的余数最小。的余数最小。例3.Mod 4 余数最小问题状态:Fi表示到点i的最小值转移:Fi=min(Fj+numi)mod 4),j到i有边样例就出现bug Questions局部最优解不能保证全局最优解本题不符合最优化性质Fij 表示到点i余数为j是否可行求出所有x=(Fkp+numi)%4,Fix=trueSolutionDP不可滥用用之前先考虑是否符合最优化原
5、理,并且没有后效性确定了是DP之后考虑三个基本要素Summary状态有两维或者多维Fij表示ij这个区间的最优值Fi-1j,Fij-1 FijFik+Fkj Fij Part 2.区间动态规划在一园形操场四周摆放在一园形操场四周摆放N堆石子堆石子(N100),现要将石子现要将石子有次序地合并成一堆有次序地合并成一堆.规定每次只能选相临的两堆合规定每次只能选相临的两堆合并成一堆并成一堆,并将新的一堆的石子数并将新的一堆的石子数,记为该次合并的得记为该次合并的得分。编一程序分。编一程序,由文件读入堆数由文件读入堆数N及每堆石子数及每堆石子数(20),(1)选择一种合并石子的方案选择一种合并石子的方
6、案,使得做使得做N-1次合并次合并,得分得分的总和最少的总和最少(2)选择一种合并石子的方案选择一种合并石子的方案,使得做使得做N-1次合并次合并,得分得分的总和最大的总和最大例4.石子合并Example贪心N=5,石子数分别为石子数分别为3 4 6 5 4 2用贪心法的合并过程如下:第一次 3 4 6 5 4 2得分 5第二次 5 4 6 5 4得分9第三次 9 6 5 4得分9第四次 9 6 9得分15第五次 15 9得分24第六次24总分:62第一次3 4 6 5 4 2得分 7第二次7 6 5 4 2得分13第三次13 5 4 2得分6第四次13 5 6得分11第五次 13 11得分2
7、4第六次24总分:61显然,贪心法是错误的。用datai,j表示合并第ij颗石子的分值状态:maxi,j=max(maxi,k+maxi+k,j k+datai,k+datai+k,jk)(2=k=j)初始条件:maxi,1=0状态:mini,j=min(mini,k+mini+k,j k+datai,k+datai+k,j k)(0=k=j)初始条件:mini,0=0时间复杂度:O(N2)Solution在一条马路上,有一排灯,一个小朋友要去关灯,如果灯没有被关掉,就会每秒造成一定的损失。小朋友一开始在某一个位置,在他左边和右边分别有一些灯,给出这些灯和他的距离以及每个灯每秒会造成的损失,求
8、一个方案使得损失最小,输出最小损失。灯的个数=1000例5.关灯问题关掉的灯一定是一个连续的区间如果路过一个灯但是没有去关掉它设 optij0/1 表示区间i,j中的灯都被关掉之后的最小损失,最后一维表示小朋友的当前位置转移:考虑当前的关灯操作时间复杂度:O(N2)Solution设一个n个节点的二叉树tree的中序遍历为(l,2,3,n),其中数字1,2,3,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:例6.加分二叉树(NOIP2003)subtree的左子树
9、的加分 subtree的右子树的加分subtree的根的分数 若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。试求一棵符合中序遍历为(1,2,3,n)且加分最高的二叉树tree。Solution注意到任意一棵子树的中序遍历一定是一段连续的区间枚举区间中的第几个元素作为这一段区间的根记fij表示中序遍历为i,j这个区间的子树的最大分数,gi表示第i个点的分数Fij=max(Fik-1*Fk+1j+gi)初始条件:Fij=0Solution给你一个矩阵,其边长均为整数。你想把矩阵切割成总数最少的正方形,其边长也为整数。切割工作由一台切割机器完成,它能沿平行于矩形任
10、一边的方向,从一边开始一直切割到另一边。对得到的矩形再分别进行切割。矩形边长小于等于100例7.矩形分割问题Fij表示长为i宽为j的矩形所需的最小正方形个数Fij=min(Fik+Fij-k,Fkj+Fi-kj)Solution见外部题目描述例8.psolve状态:Fij表示ij在一个月做完的最小所需月份枚举上一个做了ki-1转移方程:Fij=min(Fki-1+1),s1ij+s2ki-1=P,且Fki-1合法初始条件:F00=1此题写起来有好多小细节,建议练习代码Solution动态规划问题具有以下基本特征动态规划问题具有以下基本特征:1、问题具有多阶段决策的特征。2、每一阶段都有相应的“
11、状态”与之对应,描述状态的量称为“状态变量”。3、每一阶段都面临一个决策,选择不同的决策将会导致下一阶段不同的状态。4、每一阶段的最优解问题可以递归地归结为下一阶段各个可能状态的最优解问题,各子问题与原问题具有完全相同的结构。动态规划的基本模型状态压缩是一种非常暴力的动态规划,特征也非常明显,一般适用于数据规模较小的情况。状态压缩复杂度通常情况下是是指数级的,编程复杂度也相对较大。所谓状态压缩,就是把一个比较复杂的状态压缩为一个数,通常采用某一种进制的表示方法经常通过记忆化搜索来实现Part 3.状态压缩动态规划放寒假了,小D终于可以回家了。一个学期之后他有太多的东西想带回家。小D的背包可以被
12、看作一个4行N列的矩阵,每个物品放入背包的物品恰好需要占据两个相邻的方格,任意两个物品不能占据相同的方格。为了充分的利用自己的背包,小D希望背包的所有空间都放置了物品,也就是说,背包中恰好放入了2N个物品。现在小D想知道,不同的放置方案数有多少种。例9.多米诺骨牌覆盖搜索?n很大,超时严重动态规划?如何表示状态?注意到每一列最多只有4行,每一个格子对下一行的影响只有2种:下一行对应的格子是否可以和当前格子一起放进一个物品状态压缩!0/1表示每个格子的状态,4位二进制数表示一行的状态Solution用FkS来描述一个状态,这个状态表示已经把矩阵的前k-1列全部放满,并且第k列的覆盖情况为S(s为
13、一个4位二进制数),此时的摆放方案数(注意,其实只有S中1的个数为偶数时状态才有意义,更加深入的探讨会发现需要使用的状态很少)。通过枚举第k列骨牌的放置方案,不难得到从Fku(u=0 15)到Fk+1v(v=0 15)的转移方程。这个过程需要另外写一个程序去枚举才能完成。SolutionL盏灯,每盏灯为0/1,表示亮的或暗的有一个叉子有T个叉尖,相邻两个叉尖的距离等于相邻两盏灯的距离。有些叉尖断了,用0表示,否则为1叉子对准开关,可以改变灯的状态已知初始灯的状态和叉尖状态,求叉尖操作的序列使得最后亮着的灯最少L=50,T=7例10.xlite同一位置只可能操作一次可以从左到右依次操作FiS表示最后T盏灯灯的状态为S时,前i盏灯至少还亮着多少盏S为一个T位二进制,0表示暗,1表示亮枚举是否在i-T+1i+1操作,从而转移到Fi+1K时间复杂度:O(L*2T)Solution一定要符合最优化原理,即满足最优子结构可按照某一顺序,从小到大求解从大到小求解可用记忆化搜索注意边界条件转移方程一定要清晰,不要漏情况状态的意义一定要清晰DP注意事项ThxQuestions are welcome