收藏 分享(赏)

动态规划(1).pptx

上传人:无敌 文档编号:799028 上传时间:2018-04-24 格式:PPTX 页数:143 大小:8.51MB
下载 相关 举报
动态规划(1).pptx_第1页
第1页 / 共143页
动态规划(1).pptx_第2页
第2页 / 共143页
动态规划(1).pptx_第3页
第3页 / 共143页
动态规划(1).pptx_第4页
第4页 / 共143页
动态规划(1).pptx_第5页
第5页 / 共143页
点击查看更多>>
资源描述

1、动态规划,四川省成都市第七中学林 鸿,基础动态规划,什么是动态规划,动态规划(英语:Dynamic programming,DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。,一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。,动态规划问题满足三大重要性质最优子结构性质子问题重叠性质无后效性,如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性

2、质为动态规划算法解决问题提供了重要线索。,最优子结构性质,子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。,子问题重叠性质,将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。,无后效性

3、,例0:菲波那切数列,递归版本:F(n)1if n=0 or n=1 then2return 13else4return F(n-1) + F(n-2),递归方式解决所形成的递归状态树,重复计算,效率太慢!,动态规划:F(n)1A0 = A1 12for i 2 to n do3Ai Ai-1 + Ai-24return An,例题1:数塔问题(经典引例),贪心?,将问题分解考虑从最优路径上的任意一点出发和原问题有什么关系?设fij表示从第i行第i个点到底部的路径权值和的最大值那么我们不难得到这样的关系fij= max(fi+1j,fi+1j+1)+aij,思考,可以从上往下扫吗?,例题2:排

4、队买票,一场演唱会即将举行。现有n个歌迷排队买票,一个人买一张,而售票处规定,一个人每次最多只能买两张票。假设第i位歌迷买一张票需要时间Ti(1in),队伍中相邻的两位歌迷(第j个人和第j+1个人)也可以由其中一个人买两张票,而另一位就可以不用排队了,则这两位歌迷买两张票的时间变为Rj,假如Rj=numj,ij然后在f中找到最大的一个值,时间复杂度是O(n2),例4:公共子序列(LCS),我们称序列Z = 是序列X = 的子序列当且仅当存在 严格上升 的序列,使得对j = 1, 2, . ,k, 有xij = zj。比如Z = 是X = 的子序列。现在给出两个序列X和Y,你的任务是找到X和Y的

5、最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。,如何暴力?,一个长度为N的字符串,其子序列有2N个每个子序列要在第二个长度为N的字符串中去匹配匹配一次需要O(N)的时间,总共也就是O(N*2N),动态规划解法,定义fij记录序列LCS的长度如果i=0或j=0 ,则fij = 0如果Xi-1 = Yi-1,则fij = fi-1j-1 + 1 如果Xi-1 != Yi-1,则fij = max fi-1j, fij-1 ,LCS练习题,hdu 1503 Advanced Fruitshdu 1159 Common Subsequenceuva 111 His

6、tory Grading要先排个序poj 1080 Human Gene Functions,例5:乌龟棋,乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1、2、3、4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。游戏中,乌龟棋子自动获得起

7、点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?,输入格式输入文件的每行中两个数之间用一个空格隔开。第1行2个正整数N和M,分别表示棋盘格子数和爬行卡片数。第2行N个非负整数,a1,a2,aN,其中ai表示棋盘第i个格子上的分数。第3行M个整数,b1,b2,bM,表示M张爬行卡片上的数字。输入数据保证到达终点

8、时刚好用光M张爬行卡片。输出格式输出只有1行,1个整数,表示小明最多能得到的分数。,用fx1x2x3x4表示分别用了四种卡片x1、x2、x3、x4张后得到的最大分数很显然, fx1x2x3x4的上一个状态是四种卡片少其中一种的一张那么,fx1x2x3x4=maxfx1-1x2x3x4,fx1x2-1x3x4,fx1x2x3-1x4,fx1x2x3x4-1+ax1+x2*2+x3*3+x4*4。,思考几个问题后,再写代码,1、每种卡片的数目需要统计吗?怎么统计?2、边界条件是什么?怎么赋值?3、DP时,每一个for的初值和终值是?4、DP时,每一个上一状态都需要计算吗?5、DP时,怎么样求上一状

9、态的最大值?,我的代码有一个小错误,在哪里?,背包问题,0-1背包,有N件物品和一个容量为V的背包。第i件物品的费用是ci,价值是wi。求解将哪些物品装入背包可使价值总和最大。注:因为每种物品只有选和不选两种情况,故称为0-1背包,用fiv表示前i件物品放入一个容量为v的背包可以获得的最大价值,考虑fiv与上一个状态之间的关系,则可以想到第i件物品可以放也可以不放,由此产生两种价值,选其较大赋值即可,所以状态转移方程:,思考几个问题,再写程序,1、边界条件是?2、DP时,for个数的区间是?3、DP时,for体积的区间是?4、DP时,如果当前要放的物品体积比v的值都要大,还要放吗?怎么样写到D

10、P中去?,空间复杂度的优化,可以将O(VN)的空间复杂度优化为O(V)在每次主循环中我们以v=V.0的顺序推fv,这样就能保证推fv时fv-ci保存的是状态fi-1v-ci的值,0-1背包练习题,Codevs1014装箱问题01背包hdu 2955 Robberies01背包hdu 1864 最大报销额01背包hdu 2602 Bone Collector01背包,完全背包问题,有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是ci,价值是wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。,分析,这个问题非常类似于01背包问题,所不同的是

11、每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件等很多种。,仍然令fiv表示前i种物品恰放入一个容量为v的背包的最大权值,则状态转移方程为:,fiv = max fi-1v-k*ci + k*wi | 0 = k*ci = v ,同样的,如果要将空间复杂度降低为O(V),让j倒着for即可,完全背包练习题:hdu 2159 FATE,多重背包,有N种物品和一个容量为V的背包。第i种物品最多有ni件可用,每件费用是ci,价值是wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。,这题目和完全背包问题很类似。

12、基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有ni+1种策略:取0件,取1件取ni件。,令fiv表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:,fiv = max fi-1v-k*ci + k*wi | 0=k=ni ,多重背包练习题,hdu 2844 Coins多重背包,混合三种背包问题,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包),01背包与完全背包的混合,for i=1.Nif 第i件物品属于01背包for v=V.0 fv=maxfv,fv-ci+wi; else if 第i件

13、物品属于完全背包 for v=0.V fv=maxfv,fv-ci+wi;,再加上多重背包,再加一个else即可,线性DP,在线性结构上进行状态转移DP,统称线性DP。例如之前学习的LIS、LCS都是线性DP再通过几道题来具体体会线性DP,例1:拦截导弹(Noip2002),某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹

14、。,实质就是LCS的反面:求最长下降子序列的长度设fi表示第以i元素结尾的最长下降序列的长度,则fi=max(fj)+1,前提是numij,例2:书的复制,现在要把maxn本有顺序的书分给n个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三、第四本书给同一个人抄写。现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。,输入第一行两个整数maxn, n;(n=maxn=100)第二行maxn个整数,第i个整数表示第i本书的页数。输出n个人抄写这maxn本书所需的最少时间。,令fij表示前

15、i个人抄到第j本书所需要消耗的最小时间。则fij = min max( fi-lk , valuek+1.j ) 其中, i-1 k j - 1,思考:这个代码的sumk + 1 , j是伪代码,意思是求k+1j的区间和。那么,怎样在不影响复杂度的情况下求这个区间和呢?,预处理前缀和到sum数组中去,将区间和转化为前缀和之差,例3:过河(codevs1105),在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,L(其中L是桥的长度)

16、。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。,从正面来考虑的话,这个问题是一个搜索性的问题,需要考虑从当前点出发可以跳到的所有点。我们只需要考虑那些能到用一步到达当前点的所有点中,踩到石头数最小的那个。即fi=minfk (max0,i-tki-s)+brii;,例4:乘积最大(codevs1017),国际数学联盟确定

17、的“2000世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛活动,你的好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:设有一个长度为N(N40)的数字串,要求选手使用M(M6)个乘号将它分成M+1个部分,找出一种分法,使得这M+1个部分的乘积最大。同时,为了帮助选手能够理解题意,主持人还举了如下一个例子:有一个数字串:312,当N=3,M=1时会有两种分法:312=36312=62这时,符合题目要求的结果是:312=62。现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。,可以先预处理出

18、原数第i到j段的数值aij是多少,这样转移就方便了,预处理也要尽量降低复杂度。fij表示把这个数前i位分成j段得到的最大乘积。fij=fkj-1*ak+1i,其中1ki=n, j=m时间复杂度为Om2n,区间DP,区间dp,一般是枚举区间,把区间分成左右两部分,然后求出左右区间再合并通过几道例题来感受区间DP,例1:合并石子codevs1063,在一园形操场四周摆放N堆石子(N100);现要将石子有次序地合并成一堆;规定每次只能选相邻的两堆合并成一堆,并将新的一堆的石子数,记为该次合并的得分。选择一种合并石子的方案,使得做N-1次合并,得分的总和最少 选择一种合并石子的方案,使得做N-1次合并

19、,得分的总和最大,示例,贪心?,分析,假设只有2堆石子,显然只有1种合并方案如果有3堆石子,则有2种合并方案,(1,2),3)和(1,(2,3)如果有k堆石子呢?不管怎么合并,总之最后总会归结为2堆,如果我们把最后两堆分开,左边和右边无论怎么合并,都必须满足最优合并方案,整个问题才能得到最优解。如下图:,分析,令fij表示将第i堆石子到第j堆石子合并的最小代价则i到j可枚举分成ikk+1j两个区间,最小代价分别为fik、fk+1j最后将这两个区间的石子合并,代价就是这两堆石子的数量总代价为这三个值相加所以,状态转移方程为,参考程序,刚才的分析有没有什么问题?,题目的要求是石子围成一个圈,那么,

20、不能这样做,将圈转化成链新链的长度为?扩展成2n-1堆,其中第1堆与n+1堆完全相同,第i堆与n+i堆完全相同,这样我们只要对这2n堆动态规划后,枚举f(1,n),f(2,n+1),f(n,2n-1)取最优值即可即可。,例2:能量项链,在Mars星球上,每个Mars人都随身佩带着一串能量项链,在项链上有N颗能量珠,能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为mrn(Mars单位),新产生的珠子的头标记为m,尾标记

21、为n。显然,对于一串项链不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。,该题与石子合并完全类似。设链中的第i颗珠子头尾标记为(Si-1与Si)。令f(i,j)表示从第i颗珠子一直合并到第j颗珠子所能产生的最大能量,则有:f(i,j)=Maxf(i,k)+f(k+1,j)+Si-1*Sk*Sj, i=kj边界条件:f(i,i)=01=ikj=n至于圈的处理,与石子合并方法完全相同。,例3:最优三角剖分,给定由N顶点组成的凸多边形每个顶点具有权值将凸N边形剖分成N-2个三角形求N-2个三角形顶点权值乘积之和最小?,右边的凸五边形分成123 , 135, 3

22、45三角形顶点权值乘积之和为:121*122*123+121*123*231+123*245*231= 12214884,样例,如果我们按顺时针将顶点编号,则可以用相邻两个顶点描述一个凸多边形。设f(i,j)表示ij这一段连续顶点的多边形划分后最小乘积枚举点k,i、j和k相连成基本三角形,并把原多边形划分成两个子多边形,则有f(i,j)=minf(i,k)+f(k,j)+ai*aj*ak1=ikj=n时间复杂度O(n3),例4:棋盘分割,将一个的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形

23、棋盘。(每次切割都只能沿着棋盘格子的边进行),任务:棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。,样例,输入31 1 1 1 1 1 1 31 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 01 1 1 1 1 1 0 3输出1.633,均方差:算术平均值:,均方差公式化简,由化简后的均方差公式:,因此,我们需要求出各棋盘分割后的每个棋盘各数平方和的最小值,设为w,那么答案

24、为:,棋盘切割后的四种情况,区间DP总结,该类问题的基本特征是能将问题分解成为两两合并的形式。解决方法是对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优值。状态转移方程的一般形式如下: f(i,j)=maxf(i,k)+f(k+1,j)+决策,k为划分点,树形DP,大多数动规都是在一维二维这种规则的背景下的,可以解决的问题比较局限,而树作为一种特殊的图,可以描述比较复杂的关系,再加上树的递归定义,是一种非常合适动规的框架,树型动态规划就成为动规中很特殊的一种类型。,树,有n个点,n-1条边的无向图,任意两顶点间可达无向图中任意两个点

25、间有且只有一条路一个点至多有一个前趋,但可以有多个后继无向图中没有环,例1:加分二叉树,给定一个中序遍历为1,2,3,n的二叉树每个结点有一个权值定义二叉树的加分规则为:左子树的加分 右子树的加分根的分数若某个树缺少左子树或右子树,规定缺少的子树加分为1。构造符合条件的二叉树该树加分最大输出其前序遍历序列,样例分析,输入样例55 7 1 2 10输出样例1453 1 2 4 5,性质:中序遍历是按“左-根-右”方式进行遍历二叉树,因此二叉树左孩子遍历序列一定在根结点的左边,右孩子遍历序列一定在根结点的右边!因此,假设二叉树的根结点为k,那么中序遍历为1,2,n的遍历序列,左孩子序列为1,2,k

26、-1,右孩子序列为k+1,k+2,n,如下图,设fij表示中序遍历为i,i+1,j的二叉树的最大加分,则有: fij=maxfik-1*fk+1j +dk,边界?fii = di,答案?f1n,区间?1=i=k=j=n,要构造这个树,只需记录每次的决策值,也就是记录下最优决策时的根结点为k最后根据这个根节点即可得出这前序遍历。,由中序遍历得到前序遍历,例2:参加晚会(vijos1706),某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的搞笑指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总搞笑指数最

27、大。,样例输入与输出,分析,任何一个点的取舍可以看作一种决策,那么状态就是在某个点取的时候或者不取的时候,以他为根的子树能有的最大活跃总值。分别可以用fi1表示第i个人来以i为根的子树的最优值fi0表示第i个人不来以i为根的子树的最优值,当i来的时候,fi1 += fj0; /j为i的下属当i不来的时候,fi0 +=max(fj1,fj0); /j为i的下属,边界?fi1初始值为每个人的活跃值fi0初始值为0,两种实现方式,记忆化搜索:易于实现,但可能会爆栈拓扑排序动规:实现起来比较麻烦,例3:选课(树形DP+背包),给定n门课程,每门课程有一个学分值要从n门课程中选择m门课程,使得学分总和最

28、大其中选择课程必须满足以下条件:每门课程最多只有一门直接先修课要选择某门课程,必须先选修它的先修课n,m=300,输入描述 输入文件的第一行包括两个整数N、M(中间用一个空格隔开)其中1N300,1MN 以下N行每行代表一门课。课号依次为1,2,N每行有两个数(用一个空格隔开)第一个数为这门课先修课的课号(若不存在先修课则该项为0)第二个数为这门课的学分学分是不超过10的正整数输出描述 输出文件只有一个数,实际所选课程的学分总数,分析,如果把前驱结点看成父结点,换句话说,每个结点只有一个父结点。显然具有这种结构的模型是树结构,要么是一棵树,要么是一个森林。,如图1,为两棵树,我们可以虚拟一个结

29、点,将这些树连接起来,那么森林就转会为了一棵树,选取结点时,从每个儿子出发进行选取。,如果原树是一棵二叉树,那就好办了:设dpuv表示以u为根节点选v门课程所得最大学分,考虑u的两个儿子节点,一个节点选i门,则另一个节点剩v-i-1门,还是用dfs做,状态转移方程为,那么问题来了:1、原树不一定是一棵二叉树2、如果u节点不选,怎么dp?,第一个问题:多叉转二叉,前提是我们仍要把树的信息保留下来,也就是谁是谁的孩子,谁是谁的兄弟。但是二叉只能保存两个孩子,但我们可以把两个孩子改成两个关系,也就是我们利用二叉来储存关系,一个是孩子,一个是兄弟。当一个节点是另一个节点的孩子时,就放在父亲节点的左孩子

30、上,是兄弟,就该放在右孩子上,也就是所谓的“左儿子,右兄弟”。,多叉转二叉参考代码,第二个问题:u节点不选,其子树所有节点都不能选,也就是只能从原树中u节点的兄弟节点也就是二叉树中右儿子开始dfs,综合起来状态转移方程就是:u节点选:u节点不选:,还有一种不需要转二叉的做法,自己去网上查阅,例4:通向自由的钥匙,通向自由的钥匙被放n个房间里这n个房间由n-1条走廊连接。每个房间里都有特别的保护魔法,在它的作用下,我无法通过这个房间,也无法取得其中的钥匙。如果第i件房取消魔法需要耗费cost能量,并取得keys数量的钥匙 。如果我拥有的能量为P,从号房间出发,我最多能取得多少钥匙?n=100,p

31、,cost和keys都是整型。,P=5可取,三间房的钥匙,消耗为+,获得的钥匙为+,这n个房间由n-1条走廊连接,说明该问题的模型是一棵树也就是说,给出P的资源,如何在树中分配这些资源,得到最大值,即钥匙。这是典型的树型DP问题。将树转化为二叉树,因此:树根获取资源,则左右孩子均可以获取资源树根不获取资源,则左孩子不能获取资源,右孩子可以获取资源。,设f(i,j)表示以i为根结点的二叉树分配分配j的能量所获得的最多钥匙数,则有,边界: f(i,0)=0答案: f (1,P)时间复杂度为O(NP2),例5:软件安装(2010河南省选),有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值

32、为Vi。我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大)。软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作(软件i依赖软件j)。幸运的是,一个软件最多依赖另外一个软件。如果一个软件不能正常工作,那么它能够发挥的作用为0。我们现在知道了软件之间的依赖关系:软件i依赖软件Di。 一个软件只能被安装一次,如果一个软件没有依赖则Di=0,这时只要这个软件安装了,它就能正常工作。现在请你设计出一种方案,安装价值尽量大的软件。,若安装软件i必须先安装j,则从i向j连一条有向弧,则软件的约束关系就构成了一个

33、有向图。如下图:可以看出如果有k个制约关系,则有k条边,中间会存在环,处理环:由于环为互为前提,要选择环中的一个必须都进行选择,因此可以将环缩成一个点,这个点的所占空间和价值为其他点的和。,如何缩点,Tarjan求强连通分量(SCC),目的就是缩点,缩点后原图变为一棵树或是一个森林,然后再转二叉树,与前面讲的例题是一样一样的设f(i,j)表示以i为根结点的二叉树分配j资源的最大价值,状态压缩DP,引例:格子放车,在n*n(n20)的方格棋盘上放置n个车(可以攻击所在行、列),求使它们不能互相攻击的方案总数。,根据组合数学,本题答案很快求出: n!如何用状态压缩dp求解?,我们一行一行放置车。取

34、棋子的放置情况作为状态,某一列如果已经放置棋子则为1,否则为0。这样,一个状态就可以用一个最多20位的二进制数表示。例如n=5,第1、3、4列已经放置,则这个状态可以表示为01101(从右到左)。设fs为达到状态s的方案数,则可以尝试建立f的递推关系。,考虑n=5,s=01101因为我们是一行一行放置的,所以当达到s时已经放到了第三行。又因为一行能且仅能放置一个车,所以我们知道状态s一定来自:,前两行在第3、4列放置了棋子(不考虑顺序,下同),第三行在第1列放置; 前两行在第1、4列放置了棋子,第三行在第3列放置; 前两行在第1、3列放置了棋子,第三行在第4列放置。,这三种情况互不相交,且只可能有这三种情况,根据加法原理,fs应该等于这三种情况的和。写成递推式就是:,根据上面的讨论思路推广之,得到引例的解决办法:,

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

当前位置:首页 > 实用文档 > 解决方案

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


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

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

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