随笔分类 - 动态规划
摘要:http://codeforces.com/contest/313/problem/D区间DP很好的一道题目,是上周的比赛的题目了现在才补上来题意:给一个总区间,下面m个小区间,每个小区间有对应的花费,要求用这些小区间去覆盖总区间(允许有重叠),要求覆盖k个单元(不一定连续,只要k个),问最小花费是多少很典型的区间dp问题,不过数据很大,要想想怎么处理留意到,总区间长度只有300,但是可供选择的小区间的数目多达10^5个,所以可知很多区间是可以去掉的,相同的区间,我们当然只保留花费最小的,但是除此之外还能怎样再减少小区间的数目呢?while(m--) { int x,y; ...
阅读全文
摘要:LCA参考Yuan神博客:/*题意:给出一棵节点有值的树,给出Q个询问(a,b),问从a到b的最大盈利(即:先在最小值买入,再在最大值卖出)我有想过用一个新序列w2-w1,w3-w2,,wn-wn-1这样只需用O(n)求得最大子段和即为结果Max-Min了但Q很大,每次都找一个路径会超时用类似Tarjan算法进行处理,但在find()那里要修改一下对每个几点记录4个值up[v]表示从v到目前的根的最大盈利down[v]从目前的根到v的最大盈利Max[v]表示到目前的根的最大值Min[v]表示到目前的根的最小值转移看update!在LCA(u,v)处再来计算,这样那四个值才是正确的值!!*/#i
阅读全文
摘要:LCA题意:先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂。我们知道,这m条边连上后这颗树必将成环,假设新边为(u,v),那么环为u---->LCA(u,v)------->v-------->u,我们给这个环上的边计数1,表示这些边被一个环覆盖了一次。添加了多条新边后,可知树上有些边是会被多次覆盖的,画图很容易发现,但一个树边被覆盖了2次或以上,它就是一条牢固的边,就是说毁掉它再毁掉任何一条新边都好,树都不会断裂,这个结论也是很容易证明的,画图更明显,所以不累述所以这启发了我们,要统计所有
阅读全文
摘要:递推(DP)http://codeforces.com/contest/313/problem/B题意:比较好懂,一个字符串只有.或者#字符,给你一段区间[x,y],其实y>x,让你在这个区间里面统计一个数字,即这个子串,相邻两位,若s[i]=s[i+1]则计数一次,然后输出结果这题一看,其实想到了线段树,因为原串,如果一段连续的.....则看成是一串白色的段,一段连续的#####则看成是一段黑色的段,那么原串可以看成是线段树的总区间被一系列的黑白段覆盖,对于每个查询就在线段树上查询它被什么黑白段覆盖,并且覆盖了多长,不过鉴于比赛时间短,而且好像大材小用的感觉,就没再往线段树上面想,比赛
阅读全文
摘要:二维RMQ题意:给一个n*m的矩阵,下面q的询问,每个询问给出一个子矩阵的左上角和右下角的坐标,要你求出这个子矩阵里面的最大元素,然后输出,并且,这个最大元素和子矩阵的四个角上的元素比较,只要能和其中一个元素相等,就输出yes,否则输出no一维RMQ的ST算法,是叫一段2^i长度的序列分成两个2^(i-1)的序列然后计算。二维的RMQ依然使用ST的DP思想,不过对于一个矩形,将其分成完全相等的4个部分,然后求最值,特殊情况是,当一个子矩阵的宽为1,即在宽上不能二分的时候,已经长为1,即长不能二分的时候,其实就是一个一维的RMQ,我是采用了单独处理的方法(我把它归为初始化的一部分),而对于一般情
阅读全文
摘要:RMQ模板题,用ST算法//DP预处理//dp[i][j] 表示从下标i开始,长度为2^j的最大值//状态转移方程 dp[i][j] = max{ dp[i][j-1] , dp[i+2^(j-1)][j-1] }//也就是一个长度为2^j的区间,二分为两个2^(j-1)的长度//对于查询[a,b]以内的最大值,先求出区间长度LEN = b-a+1//查询结果为 res = max{dp[a][k] , dp[b-2^k+1][k]} , 关键是k,是什么,怎么计算//当满足 2^k >= LEN/2 , 且k最小时,这个k就是我们要的值//k可以用计算公式一步算得 : k = (int
阅读全文
摘要:继续复习DP,图论题意:有向图,n个点,m条边,t个查询。从点u到点v可能有多条路径,找出一条,使这条路径的权值最大的那条边的值在所有路径中是最小的,即最大值最小状态转移方程:dp[i][j]表示从i到j的最小的最大值。dp[i][j] = min{ dp[i][j] , max(dp[i][k] , dp[k][j]) }#include <cstdio>#include <cstring>#define N 310#define INF 0x3f3f3f3f#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) (
阅读全文
摘要:dp,图论题意:输入n和m表示n个牛(从1到n标号),下面m个信息,A B,表示A牛能打赢B牛。现在要给所有的牛排名(按实力从高到低),问哪些牛的排名是可以确定的如果知道由l个人能打赢自己,自己能打赢w个人,且l+w+1 = n的话,那么自己的排名就是可以确定的,所有转化为要求出,每个人,能打赢多少人,能被多少人打赢建图: dp[i][j]=1表示i能打赢j,=0表示不确定他们之间的关系,然后类似floyd那样dp,若dp[i][k]=1且dp[k][j]=1,则dp[i][j]=1dp结束后扫描一次整个dp数组即可被归为中等题,这不是水题么。。。。#include <cstdio>
阅读全文
摘要:复习一下基础DP,记忆化搜索题意:给一个名字,和n*m矩阵,下面是矩阵信息,每次在一个格子,可以向上下左右移动,但是要求那个数字比当前所在格子数字小。可以从任意点出发,问最长的距离是多少dp[i][j]表示从(i,j)出发能走的最长路dp[i][j] = max{ dp[x][y] } + 1 , 其中(x,y)是(i,j)附近的四个格子之一并且a[x][y] < a[i][j]#include <cstdio>#include <cstring>#define N 110#define MAX 110#define max(a,b) ((a)>(b)?(a
阅读全文
摘要:poj 2168 相同的题目区间DP题意:输入n,表示有n个海龟在一条直线上,乌龟可以站在相同的位置(即坐标可以相同),下面n行,每行两个数字,表示第i个乌龟给出的信息,第一个数字表示它前面有多少只乌龟,第二个数字表示它后面有多少个乌龟。并不是每个乌龟的信息都是正确,有些乌龟的信息是假的,或者和别的乌龟信息冲突,你的任务是选出尽量多的乌龟,使他们的信息不冲突,然后输出有多少个乌龟说谎,和那些乌龟的编号,可能有多种情况,只要保证说谎的乌龟数最少,输出哪种情况都可以分析:乌龟可以站在一样的位置,我们给乌龟排名,可以把它们放在不同的位置 例如 1 2 3 3 3 4 4 5 , 虽然有些排名相同,但
阅读全文
摘要:简单树型DP题意:一个图,N个点,N-1条边,并且说明是树(一棵树,连森林都排除掉了)。在这颗树中删除一个点rt以及和他关联的边,那么剩下的部分将会是森林,统计森林中每棵树的节点数,最大值记录下来为dp[rt],你的任务是找出最小的dp[rt],如果有多个rt相等,那么按升序输出所有rt的编号一个最大值最小的问题,解法是求出所有的dp[rt]然后记录最小值因为本来是一棵树,用哪个做顶点都可以,默认为1,为整个树的祖先。定义sum[rt] = 以rt为根的子树含有的节点数 dp[rt] =dp[rt]:除去rt后,各个分块中节点数的最大值 ans = min{ dp[rt] }; 删掉rt...
阅读全文
摘要:树DP题意:输入n和m,表示n个城市,m条无向边,下面一行n个数字,表示每个城市的权值,下面m行是每条边的信息,u,v,w,顶点和边权。问你从一个城市出发,走出一条路线,使得权值和最大,权值和包括这条路线上城市的权值和边的权值和。题中有一句话出卖了它是个树DP:It turned out that if Petrovich can fly (using one or several flights) from townito townj, then there is exactly one way to do this.从一个顶点去另一个顶点如果连通的话只有一条路径,说明这个无向图其实是个无根
阅读全文
摘要:http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1380题意什么的都在里面,中文题目不用解释个人感觉是数据的问题,因为网上找遍了代码都不能通过,算了还是不纠结了代码写得也不好,无心机改了/*dp思想:dp[rt][p],当前节点rt,有p点,能获得的最大价值1.可以用一部分来升级当前的这个技能,升的级数不确定,但升级需要花费点数,花费的点数 c<=p2.不升级当前,全部用于升级子树和兄弟。但注意,若不升级当前节点而且当前节点等级是0,那么 其子树不能升级,只能升级其兄弟*/#include <cstdio>#includ
阅读全文
摘要:树DP经典问题,公司聚会,下属和直属上司不能共存,给出每个人的快乐值,再给出每个人的编号和他的上司,选出一些人参加聚会使快乐值最大/*从叶子开始选择,每个节点只有选不和不选两种可能,dp[rt][0],dp[rt][1]分别表示选和不选该节点dp[rt][1]=sum{ dp[son][0] }+val[rt] , 因为跟选了它的儿子就全部不能选dp[rt][0]=sum{ max{dp[son][0] , dp[son][1]} }如果根不选,那么儿子的选择就多样化了,每个儿子又是互不干扰的所以令每个儿子最优,加起来根就是最优的,而每个孩子无非还是选和不选,一比较就能得到每个儿子的最优方案而
阅读全文
摘要:提交地址:http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1709问题描述如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和;如果对于某个y>x且y的约数和为x,那么x也可以变成y。例如,4可以变为3,1可以变为7。限定所有的数字变换在不超过n的正整数范围内进行,求不断进行数字变换且没有重复数字出现的最多变换步数。输入数据 输入一个正整数n。输出数据 输出最少需要花费的时间。 (这里原题应该打错了,应该是输出最大转换步数)样例说明 一种方案为:4→3→1→7。时间限制 各测试点1秒内存限制 你的程序将..
阅读全文
摘要:树型DP这题刘汝佳居然归在数学题里面,他的用意应该是想归在递推的,但是这题更应该属于一个经典树DP题意:给一个图,两个点间不会有重边,边时双向连通的,另外注意这句话,there is only one route from a village to a village that does not pass through some other village twice.这句话说明了,这个图是很特殊的,其实是一个无根树。要求的是,找出两点,他们的距离最远有两种思路,但是本质还是一样的,写法不同,推荐后面那种第一种:/*思考方法:这个图的本质是个无根树,所以我们指点任意一个节点为树根即可,因而指
阅读全文
摘要:提交地址:http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1286这题是OI的经典题,不难,注意一点,原题是用文件输入输出的,但是这里的提交直接标准输入输出即可这题的题意很清晰,明说了是二叉树(而且只能在两个孩子的节点和叶子节点)。注意输入给出的信息,对于一对数据,a,b,a指通过走廊的时间,那是不是树中边的信息呢?不是的,应该是点的信息。树中每一个点都应该包含两个信息,就是时间花费和它有多少张画,对于非叶子节点而言,它的画数都是0,而时间是有的,对于叶子节点,除了有画数外,它也是有时间花费的另外,本题读题要仔细,它是说在警察来之前就要离
阅读全文
摘要:树型DP:二叉苹果树另外一个提交地址:http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1375里面有中文题目,不解释题目了。树型DP:主要是两点,怎么建树,怎么DP。这两者应该说是相互制约相互影响的,怎么DP就要怎么建树,而建树方法对不对也决定了你能不能DP。所以先分析怎么DP的,再分析怎么建树题意说要保留m个树枝,而且注意权值不是点的而是树枝的,这样子并不利于我们解决问题,我们可以转化一下,把权值转移给节点。首先给出所有边的信息后,我们的建树是唯一的(这个问题值得思考一下为什么,唯一是指不考虑左右孩子的位置,而只考虑从属关系,好像1(3
阅读全文
摘要:在朱全民的PPT介绍的一个树型DP经典题,《选课》,中文题目,不结束找了很久找到了可以提交的OJ,重庆八中http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1376简单分析一下:1.建树,不要用一般的孩子表示法,这里要讲森林转为二叉树处理才能强劲有力,所以用(左)孩子(右)兄弟法建树2.建树之后就可以DP,DP的策略写在代码中了,不多说对于树型DP的初步感觉1.建树很重要(跟图论里面构图很重要,构图失败基本上整个算法失败了)2.树这种结构比较特殊,要找到特殊型入手,一是从属关系,即孩子是属于某个双亲的,二是平行关系,兄弟之间是平行的。因而一
阅读全文
摘要:动态规划黑书的例题,老题了,2000年的国赛题,题意看黑书吧,太长了。。。比较典型的按阶段性决策,整个dp还是不难想的,1A分析在代码中/*按时间决策的DP,或者说按阶段性决策当前要跳的格子出现了,那么怎么跳其实只有两种选择,用左脚去踩或者右脚去踩所以要枚举前一个格子结束的时候,左右脚在什么地方,如果用左脚踩会产生多少花费,用右脚踩会产生多少花费dp[i][l][r]表示踩完第i次,左脚在l这个格子上,右脚在r这个格子上的最小花费那么最终要找的答案在dp[n][l][r]中,所以要扫描一次dp[n]找到最大值由题目的性质就知道可以使用滚动数组,而且题目也没提到序列的长度,所以用滚动数组也更为保
阅读全文