1、动态规划(1) 基础模型,戴一桥 电信2011级 QQ 75634949,前言,动态规划是信息学竞赛中选手必须熟练掌握的一种算法,他以其多元性广受出题者的喜爱。基本模型:多阶段过程的最优化问题,使用动态规划的条件,最优化原理无后效性子问题的重叠性,给你一个数字三角形, 形式如下:12 34 5 6 7 8 9 10 找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大.,搜索? 2n 怎么办? 动态规划! Fij = max(fi-1j-1,fi-1j)+aij,三条件,最优化原理:一个最优化策略的子策略总是最优的。 无后效性:对于某个给定的阶段状态,它以前各阶段的状态无法直接影响
2、它未来的决策,而只能通过当前的这个状态。 子问题的重叠性:动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。,三要素,Fij = max(fi-1j-1,fi-1j)+aij 状态 阶段 决策,最长上升子序列,给出一个由n个数组成的序列a1n,找出它的最长单调子序列的长度。问题分析: 如果前i-1个数中用到aj (ajai)构成了一个的最长的上升序列,加上第i个数ai就是前i个数中用到i的最长的序列了。,从上面的分析可以看出这样划分问题满足最优子结构,那满足无后效性么?显然对于第i个数时只考虑前i-1个数,显然满
3、足无后效性,可以用动态规划解。,最长上升子序列,状态转移方程 fi=max(fj)+1 (0=ji 且ajai)For (i=1;i=n;i+) For (j=1;ji;j+) If (ajai) Fi = max(fi,fj+1);,拦截导弹 poj1887 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统 有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高 于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以 只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹。,状态
4、的表示 fi表示当第i个导弹必须拦截时,前i个导弹最多能拦截掉多少。状态转移方程 fi=max(fj)+1 (0=ji 且ajai),合唱队形,N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,K,他们的身高分别为T1,T2,TK, 则他们的身高满足T1Ti+1TK(1=i=K)。你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。(poj 2711),分别从前往后,从后往前做最长上升子序列 最后扫一遍,寻找两种序列和长度最大的值,类似的问题: 最长
5、下降子序列 最长上升子串 最长公共子串,滑雪问题,(poj1088)Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。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,按照高度,从大到小排列,然后利用动态规划往一个高度下降的方向就可以处理,转换为类似于最长上升子序列问题Fi=max(fj)+1 (ai
6、aj),区域动归,【石子合并】 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。 试设计一个算法,计算出将n堆石子合并成一堆的最小代价。,阶段:石子的每一次合并过程,先两堆合并,再三堆合并,.最后N堆合并 状态: si,j 表示从编号为i的石头开始合并j堆 决策:把当前阶段的合并方法细分成前一阶段已计算出的方法,选择其中的最优方案,第一阶段:两堆合并过程如下,其中 sum(i,j)表示从i开始数j个数的和 s1,2=s1,1+s2,1+sum(1,2) s2,2=s2,1+s3,1+sum(
7、2,2) s3,2=s3,1+s4,1+sum(3,2) s4,2=s4,1+s5,1+sum(4,2) s5,2=s5,1+s6,1+sum(5,2) s6,2=s6,1+s1,1+sum(6,2),第二阶段:三堆合并可以拆成两两合并,拆分方法有两种,前两个为一组或后两个为一组 s1,3=s1,2+s3,1+sum(1,3) s1,3=s1,1+s2,2+sum(1,3)s2,3=s2,2+s4,1+sum(2,3) s2,3=s2,1+s3,2+sum(2,3),第三阶段:四堆合并的拆分方法用三种,同理求出三种分法的得分,取其最优即可。以后第四阶段、第五阶段依次类推,最后在最后阶段中找出最
8、优答案即可,状态转移方程Fi,j=max(fik+fi+k-1j-k)+sumi,j,时间轴动归,Tom的烦恼 Tom加工一些不同零件,不同零件的加工费和加工时间要求不同,有些加工时间要求甚至是冲突的(但开始和结束时间相同不算冲突)在某个时间内他只能选择某种零件加工(因为他只有一台机器),为了赚得尽量多的加工费,Tom不知如何进行取舍,现在请你帮Tom设计一个程序,合理选择部分(或全部)零件进行加工,使得得到最大的加工费。,输入文件input.txt的第一行是一个整数n表示共有n个零件须加工。接下来的n行中,每行有3个整数,分别表示每个零件加工的时间要求,第一个表示开始时间,第二个表示该零件加
9、工的结束时间,第三个表示加工该零件可以得到的加工费。(数据中的每个数值不会超过100000) 输出文件output.txt只包含一个整数,表示Tom可以得到的最大加工费。结果输出到文件output.txt,输入输出样例,【输入样例】 3 1 3 10 4 6 20 2 5 25 【输出样例】 30,用sumi表示到达时刻i时所能得到的最大收益,用aj,1表示任务j的开始时间,aj,2表示任务j的结束时刻,bj表示任务j完成所得的加工费。 状态转移方程 sumi=maxsumk +bj | 1=k=aj,1aj,2i,核心程序如下,sum0:=0; for i:=1 to m do begin
10、max:=0; for j:=1 to n do if aj,2=i then if maxsumaj,1+bj then max:=sumaj,1+bj; sumi:=max; end;,算法优化,1、原算法的时间复杂度是?2、是否有优化的余地?3、排除重复是本题一个优化的方向,优化后的核心算法部分,对所有任务按照结束时间进行从小到大排序; 计算最后一个任务的结束时刻m; ans0:=0; for i:=1 to m do beginansi:=ansi-1;if 当前有任务j刚好结束(j可能不止一个) then beginif ansiansaj,1+bj then ansi:= ansa
11、j,1+bj;end; end;,传纸条,noip 2008 而小渊和小轩被安排在m行n列矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。,多进程动归,班里每个同学都可以帮他们传递,但只会帮他们一次。 还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低,可以用一个0-100的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度之和最大。输出最大的好心程度之。,问题简化,假定小渊
12、传给小轩,小轩无需回复。,数字三角形!,Fij=max(fi-1j-1+fi-1j)+aij,两条路,加一维! Fijk= max(fi-1j-1k-1, fi-1j-1k, fi-1jk-1, fi-1jk)+aij+aik对吗?,加判断! Fijk= max(fi-1j-1k-1, fi-1j-1k, fi-1jk-1, fi-1jk)+aij+aikj!=k & 不能从上一行的同一个格子转移,背包引入,有N件物品和一个容量为V的背包。第i件物品的容量为1,价值是wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。,01背包,有N件物品和一个容量为V的背包。第
13、i件物品的费用是ci,价值是wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。,这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 fiv表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。 fiv=maxfi-1v,fi-1v-ci+wi。,空间优化,for i=1Nfor v=0V fv=maxfv,fv-ci+wi;不对! 会导致物品重复购买,for i=1N for v=V0 fv=maxfv,fv-ci+wi;空间复杂度O(V),完全背包,有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是ci,价值是wi。
14、求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。,fiv=maxfi-1v-k*ci+k*wi|0=k*ci=v这跟01背包问题一样有O(N*V)个状态需要求解。求解状态fiv的时间是O(v/ci),总的复杂度是超过O(VN)的,优化,把第i种物品拆成费用为ci*2k、价值为wi*2k的若干件物品,其中k满足ci*2kV 二进制的思想 这样把每种物品拆成O(log(V/ci)件物品,得到了更优的O(VN)的算法。,多重背包,有N种物品和一个容量为V的背包。第i种物品最多有ni件可用,每件费用是ci,价值是wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容
15、量,且价值总和最大。,这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有ni+1种策略:取0件,取1件取ni件。令fiv表示前i种物品恰放入一个容量为v的背包的最大权值,则:fiv=maxfi-1v-k*ci+k*wi|0=k=ni。,二维费用的背包,二维费用的背包问题是指:对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为ai和bi。两种代价可付出的最大值(两种背包容量)分别为V和U
16、。物品的价值为wi。,费用加了一维,只需状态也加一维即可。设fivu表示前i件物品付出两种代价分别为v和u时可获得的最大价值。状态转移方程就是:fivu=maxfi-1vu,fi-1v-aiu-bi+wi。,有依赖的背包,这种背包问题的物品间存在某种“依赖”的关系。也就是说,i依赖于j,表示若选物品i,则必须选物品j。,金明的预算,金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于
17、某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无,如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数15表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是10元的整数倍)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 设第j件物品的价格为vj,重要度为wj,共选中了k件物品,编号依次为j1,j2,jk,则所求的总和为:vj1*wj1+vj2*wj2+ +vjk*wjk。(其中*为乘号)请你帮助金明设计一个满足要求的购物单。,分析,例举出所有的主件附件购买方案,然后做01背包如果附件数很多? 购买方案为2n,先对于每一个主件和附件集合做一次01背包再做一次背包!,推荐: 背包九讲,提问,THX,