DP
L_0_Forever_LF
一个热爱OI的OIer
展开
-
hdu5758 2016 Multi-University Training Contest 3 Explorer Bo 解题报告
感觉最近都没状态不知道为什么。。。。一道不难的题不会做,看了题解发现自己好蠢。。。。题意:给一颗n个节点的树,问你用最少的链覆盖这棵树上所有的边(可以重复覆盖),链的长度和最小为多少链的长度=覆盖的边的数量题解:树形DP首先,如果要覆盖,最少需要(n+1)/2条链,链的两端肯定是2个叶子节点,如果叶子节点数是奇数,那么有一条链由一原创 2016-09-15 21:53:25 · 668 阅读 · 0 评论 -
BZOJ3997: [TJOI2015]组合数学 解题报告
Description给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走。问至少走多少次才能将财宝捡完。此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完。题解貌似有个定理说在一个DAG中,最小链覆盖=最大独立集(这题不知道这个也行) 观察这个网格图,因为每次只能向右或向下走,所以如果一对点,一个在另一个的左下方,那原创 2016-10-10 13:32:37 · 999 阅读 · 0 评论 -
BZOJ4000: [TJOI2015]棋盘 解题报告
题解Description 1<=N<=10^6,1<=M<=6吐槽真的不得不吐槽这个题意,本来看数据范围觉得是矩乘,突然发现维护2行矩阵时间吃不下,想不到去看题解结果woc题目里给的攻击范围的矩阵第一行是第0行,棋子自己的位置其实是矩阵的第2行题解知道题意里说的攻击范围的矩阵3×p3×p指的是00~22行后就没什么好说的了,矩乘 先按状压做,先处理一下状态之间的转移,然后矩乘一下code:原创 2016-10-10 20:23:40 · 538 阅读 · 0 评论 -
BZOJ4245: [ONTAK2015]OR-XOR 解题报告
Description给定一个长度为n的序列a[1],a[2],…,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费用为c[1] or c[2] or … or c[m]。请求出总费用的最小值。 Input第一行包含两个正整数n,m(1<=m<=n<=500000),分别表示序列的长度和需要划分的段数。 第一行包含n个整数,其中第i个数为ai。 Ou原创 2016-10-10 20:35:19 · 761 阅读 · 0 评论 -
BZOJ4444: [Scoi2015]国旗计划 解题报告
DescriptionA国正在开展一项伟大的计划——国旗计划。这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈。这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边防战上作为这项计划的候选人。 A国幅员辽阔,边境线上设有M个边防站,顺时针编号1至M。每名边防战士常驻两个边防站,并且善于在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间原创 2016-10-10 20:51:44 · 1069 阅读 · 0 评论 -
hdu 5823 2016 Multi-University Training Contest 8 color II 解题报告
题意: 给你一个图,求出每个非空点集染色需要的最少的颜色数,如果有边相连的点颜色不能相同题解:一开始口胡了一个貌似正确的搜索就上了,敲完上去WA了,拍下发现这样有问题....好吧说正解其实就是要把每个点集分成若干个独立集(独立集就是所有点两两不相连),因为每种颜色染得是一个独立集,要使需要的颜色数最少,就要把点集分成尽量少的独立集,,原创 2016-09-25 09:31:33 · 517 阅读 · 0 评论 -
BZOJ3622: 已经没有什么好害怕的了 解题报告
感觉做完这题已经没有什么题害怕了呢(算了当我没说) 首先安利一个写的很好的题解orz http://www.cnblogs.com/dyllalala/p/3900077.html 写的挺详细的了,但是我总要写点什么吧,于是再解释一下做法…….首先可以把题意转化一下,如果(n+k)mod2=1(n+k)mod2=1那肯定是没有满足要求的情况了,如果不为1,问题就是要求糖果大于药片的恰好有m=(原创 2016-10-13 10:58:50 · 962 阅读 · 0 评论 -
BZOJ4011: [HNOI2015]落忆枫音
Orz PoPoQQQ:http://blog.csdn.net/popoqqq/article/details/45194103用脉络树总数减去不合法的情况(即树上有环的情况),拓扑序DP,注意特判连的边指向1的情况学到了新姿势:线性求逆元 原理: (假设现在要求a的逆元,x=Mod/a,y=Mod%a) ax+y≡0→−ax≡y→a−1≡−x∗y−1ax+y≡0→−ax≡y→a...原创 2016-10-18 08:23:20 · 946 阅读 · 2 评论 -
BZOJ4008: [HNOI2015]亚瑟王 解题报告
首先想到一种计算答案的方法,即每张牌的伤害×抽中的概率 因为对于每张牌,会影响到他的概率的只有他前面的牌,他后面的牌是否抽中对他没有影响,而一轮一轮过情况很复杂,不妨将r轮视为r个机会,将所有牌和所有机会一起考虑 f[i][j]f[i][j]为前ii张牌,用剩jj次机会的概率 可以得到一个方程: f[i][j]=f[i−1][j]×(1−p[i])j+f[i−1][j+1]×(1−(1−p[原创 2016-10-14 13:20:31 · 1473 阅读 · 0 评论 -
2339: [HNOI2011]卡农
用二进制表示一个音符的集合,那么可用的集合就有2n−12^n-1种(空集不可用),那么一段音乐所有音符都含偶数个就可以转化成一段二进制的异或和为0 用f[i]f[i]表示nn个音符可用的情况下,分成ii段,考虑顺序,有多少种方案(先算排列数,最后再将答案转成组合数,复杂度是O(n)O(n)的,直接算组合数复杂度O(nlog n)O(nlog\ n)) 设M=2n−1M=2^n-1,得到方程 f原创 2016-10-31 08:39:01 · 611 阅读 · 0 评论 -
BZOJ4013: [HNOI2015]实验比较
先并查集合并‘=’,因为所有的Xi互不相同,所以合并完后应该是一个森林,如果出现环就无解。我们新建一个根连向所有入度为0的点,就变成了一棵树,考虑树形DP。因为只要两点不是其中一点是另一点的祖先的关系,他们就可以划‘=’因为大小关系不确定,所以将‘=’连接的看做一块,f[i][j]f[i][j]表示以ii为根的子树分成了jj块转移的话,不合并块就是排列组合问题,如果合并块的话,假设不同子树的ii个块原创 2016-10-25 09:46:01 · 730 阅读 · 0 评论 -
BZOJ3162: 独钓寒江雪
一棵树,点可以染色,但是染色的点不能相邻,如果不考虑同构那这就是很简单的树形DP,设f[i][1]f[i][1]为ii节点染色子树的总方案数,设f[i][0]f[i][0]为ii节点不染色子树的总方案数 先考虑判断同构,将树hash一下,hash的方式怎么弄其实都行,比如将所有孩子的hash值加起来,子树大小为size,就再乘一个233size233^{size}什么的,这个看个人喜好,判同构担心原创 2016-11-16 07:47:26 · 895 阅读 · 0 评论 -
BZOJ1875: [SDOI2009]HH去散步
矩乘,因为不能走刚走过的边,所以矩阵里面的位置代表边,一个条边的两端开两个点放进矩阵里,这个点的值代表刚走过这条边走到这个点的方案数code#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#inclu原创 2016-12-11 16:05:55 · 830 阅读 · 0 评论 -
BZOJ1489: [HNOI2009]双递增序
题意去哪了我去根据某题解的题意描述,题目应该是给一个序列,让你把他分成两个长度为n/2的序列,使得两个序列里的数权值和下标都是递增的,奇数的情况我不知道,但看起来数据n应该都是偶数的做法有很多种,可以直接DP,la1la1la教了我一种图论做法(Orz la1la1la),然后窝想了想,打了一个 贪心+DP先讲一下图论的做法,有道题和这个有点像,问的是至少要分成几个序列,那 可以发现这是一个最小链原创 2016-12-06 14:09:31 · 875 阅读 · 0 评论 -
BZOJ1879: [Sdoi2009]Bill的挑战
字符串不是很多,可以考虑状态压缩 f[i][j]表示到匹配到第i位,匹配状态为j,j在二进制下就表示和这n个串的匹配情况 然后加个滚动 然而貌似有很多废的状态,直接DP复杂度好像也过不去,于是我就记录了当前这一层有哪些状态code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#inclu原创 2017-01-03 12:59:14 · 673 阅读 · 0 评论 -
BZOJ3107: [cqoi2013]二进制a+b
可以把问题转换成在20−2n2^0 - 2^n里选a个数,再在里面选b个数,使他们的和在二进制下有c位且最高位不大于2n2^n,使这个和最小 然后可以DP,从202^0开始选,f[i][j][l][k][0]f[i][j][l][k][0]表示选了前i位,a个数里面选了j个,b个数里面选了l个,和有k位,无进位,最后一位是1就代表有进位,然后DP一下就行了后记:这题原来可以构造的,Orz PoPo原创 2017-01-16 07:51:37 · 918 阅读 · 0 评论 -
BZOJ1880: [Sdoi2009]Elaxia的路线
康复训练的第一题智障了一个下午x1,y1,x2,y2 4个点每个点都跑一次SPFA,计算出这4个点到所有点的最短距离 然后对x1到y1的所有最短路径建一个拓扑图,先按照第二个人从x2到y2走,沿x1到y1建的拓扑图做DP,如果当前边既在x1到y1的最短路上又在x2到y2的最短路上,就可以转移,因为是路径的交集不分方向,所以再按照第二个人从y2到x2走,沿x1到y1建的拓扑图做DP,如果如果当前边原创 2017-01-12 16:41:53 · 829 阅读 · 0 评论 -
BZOJ 3174: [Tjoi2013]拯救小矮人
不会做,看了各种题解都不理解后来看这篇看懂了,这篇我觉得是我看的写的最好的了,关键就是最后小矮人跑出去的序列一定是一个身高+臂长递增的序列(意会一下?),所以按这个排序是为了DP,然后设f[i]为出去i个人后剩下人的最大高度#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmat原创 2017-02-18 09:39:33 · 764 阅读 · 0 评论 -
BZOJ1004: [HNOI2008]Cards
这道题反映出我群论不是很熟练,理解上有些问题直接burnside引理,对于一种置换下相同的方案数用DP或记忆化搜索求,然后乘个逆元#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<st原创 2017-01-18 23:11:14 · 410 阅读 · 0 评论 -
BZOJ3164: [Heoi2013]Eden的博弈问题
题意一开始看错了想半天不知道他在说什么 要求最小编号,异或和,数目,应该只能把关键叶节点全部找出来才能求 找这些节点的话,好像只能把所有最小黑方胜集合的并集和所有最小白方胜集合的并集找出来求交集 然后dfs下去很好找的吧,要保存每个节点的信息可以用一个树的结构,就是每个节点向对它贡献的节点连边,然后这个节点的信息递归下去找就行#include<set>#include<map>#inclu原创 2017-02-01 22:28:55 · 391 阅读 · 0 评论 -
BZOJ3167: [Heoi2013]Sao
所有限制关系无视方向是一棵树,那么任意定一个点为根,做树形DP,f[i][j]表示i在其子树的序列中排第j位的方案数,转移的话组合数弄一下,直接这样转移会发现复杂度很高,但是转移的方程可以转化一下,会发现每个点维护f值的前缀后缀和即可剪掉一维#include<set>#include<map>#include<deque>#include<queue>#include<stack>#inc原创 2017-02-01 22:48:12 · 941 阅读 · 0 评论 -
BZOJ3135: [Baltic2013]pipes
正常解法要高斯消元,由于数据范围太大,考虑换个思路 每条边是一个未知数,每个点是一个方程,那么可知 当n< m时,未知数比方程多,一定多解或无解 当n> m-1时,图是不连通的,没连上的点可以不考虑 于是m-1<=n<=m,就可以树形DP辣#include<set>#include<map>#include<deque>#include<queue>#include<stack>#原创 2017-03-18 07:54:18 · 687 阅读 · 0 评论 -
BZOJ2794: [Poi2012]Cloakroom
限制是a[i]<=m,b[i]>m+s,c[i]和为k 考虑到k<=100000,而a,b都很大,可以转化一下,就是询问和为k,a[i]<=m,b[i]的最小值>m+s,那么就可以按照询问的m排序,做一个DPcode:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>原创 2017-03-06 13:34:06 · 833 阅读 · 0 评论 -
BZOJ2803: [Poi2012]Prefixuffix
有个很厉害的性质,推出了这个就可以DP了有了这个DP,就可以枚举找一个最大值了 这题好像需要双hashcode:#include<map>#include<set>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#i原创 2017-03-06 22:00:06 · 402 阅读 · 0 评论 -
BZOJ3294: [Cqoi2011]放棋子
一开始一直以为可以不放完棋子…n、m都不大,可以考虑DP 因为每行、每列只能放一种颜色的棋子,所以考虑把棋盘独立成n行m列,将这些行和列分给每种颜色的棋子 定义: f[i][j]f[i][j]表示第k种棋子占据i行j列有多少种合法的放法, g[k][i][j]g[k][i][j]表示前k种棋子占据i行j列有多少种合法的放法 求ff的时候可以用容斥,用所有的放法减去所有不合法的放法,预处理一原创 2017-03-07 13:12:51 · 864 阅读 · 0 评论 -
BZOJ3163: [Heoi2013]Eden的新背包问题
嗯…因为每次只去掉一个玩偶,询问之间也独立,所以维护前缀DP和后缀DP(就是一个是f[i][j]表示1~i种玩偶,j的钱得到的最大价值,另一个g[i][j]是i~n),询问直接合并(和普通背包一样,因为去掉了第i种,所以用前缀后缀即1~i-1和i+1~n合并)或预处理n种询问..#include<set>#include<map>#include<deque>#include<queue>#原创 2017-01-31 13:49:53 · 510 阅读 · 0 评论 -
BZOJ1226: [SDOI2009]学校食堂Dining
可以发现 a or b-a and b = a xor b ,不过这和这题解法没太大关系233观察数据范围,发现Bi ≤ 7 那么说明每个人拿到饭菜的顺序不会提前7位以上,不会滞后7位以上 所以我们用f i j k 表示1~i-1 拿完了饭,j表示i~i+7拿饭的情况,k表示上一个拿饭的和i的位置关系,注意k的范围是-8~7,f是最少的时间 转移的话, 如果i已经拿了饭,直接向f i+1,j原创 2017-03-25 07:54:05 · 666 阅读 · 0 评论 -
BZOJ1260: [CQOI2007]涂色paint
设f[i][j]表示i~j染成目标颜色需要染多少次 当a[i]=a[j]时,涂i的时候可以顺便覆盖到j,所以f[i][j]=f[i][j-1] 当a[i]≠a[j]时,因为正常情况下,j需要涂完i~j-1后再涂即f[i][j]=f[i][j-1]+1,当i~j-1中有块k与a[j]颜色相同且涂的时候可以顺便涂到j时f[i][j]有可能小于f[i][j-1]+1,这时因为k涂色时要覆盖到j,所以k原创 2017-03-25 11:34:44 · 908 阅读 · 0 评论 -
BZOJ1296: [SCOI2009]粉刷匠
首先可以隔离这n块木板,分别求出涂x次最多覆盖的格子,再合并一起做一个背包 对于一块木板,因为一个格子只能粉刷一次,所以这粉刷的x次一定是连续或者不连续,不相交的x段,那么用 f i j 表示涂到i,涂了j次最多粉刷的格子数,枚举1~i-1转移即可code:#include<set>#include<map>#include<deque>#include<queue>#include<st原创 2017-03-25 12:32:29 · 391 阅读 · 0 评论 -
BZOJ1806: [Ioi2007]Miners 矿工配餐
两个矿产煤量都只与其前两次配送的食品有关,那么用f[i][x1][x2][y1][y2]表示到第i天,第1个矿前两天配送的食品是x1,x2,第二个矿前两天配送的食品是y1,y2,最大的产煤量,第一维 i 可以用滚动,不然会爆空间code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#inclu原创 2017-03-25 14:25:39 · 430 阅读 · 0 评论 -
BZOJ2121: 字符串游戏
区间DP 用C[l][r]表示l~r是否能被全部删掉,f[l][r][k][x]表示l~r和第k个串匹配是否能匹配到第x位, 注意到小串的长度≤21,而且f是个bool变量,所以可以把x压成int, 而推一下f的转移方程发现对于不同的l,他们之间是互不影响的,所以可以把l这一维删掉 那么枚举左端点,f[r][k]就代表了l~r,和第k个串的匹配情况,而且压位下转移十分方便,转移后要尝试跳一些原创 2017-03-25 14:35:17 · 584 阅读 · 0 评论 -
BZOJ2287: 【POJ Challenge】消失之物
高兴的写了个FFT发现自己是最慢的几个… 思想固化… 非正解维护一个前缀DPf[i][j]表示1~i凑出j的方案数,一个后缀DPg[i][j]表示i~n凑出j的方案数,去掉i就是f[i-1]和g[i+1]合并,用FFT卷积优化code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#inclu原创 2017-03-25 14:50:58 · 578 阅读 · 0 评论 -
BZOJ2302: [HAOI2011]Problem c
因为一旦有一个位置没有人能走到,那这种分配方案一定不合法,观察发现,令p[i]表示编号≤i的个数,一个方案合法一定有p[i]>=i 用f[i][j]表示p[i]为1~i的有j个的方案数,因为编号≤i的有固定的编号si个,所以j≥max(i-si,0) code:#include<set>#include<map>#include<deque>#include<queue>#include<原创 2017-03-25 14:59:06 · 910 阅读 · 0 评论 -
BZOJ2466: [中山市选2009]树
树形DP 首先一个点要么按一次按钮要么不按 f[i][x][y]表示i的子树内除了i全部点亮,i节点是否亮,是否按过按钮,最少按的次数code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#i原创 2017-03-25 15:02:24 · 758 阅读 · 0 评论 -
BZOJ2323: [ZJOI2011]细胞
先不考虑分裂,T个小球体,连接有多少种方式 设f[i][0],f[i][1]表示i个小球体,第i个和前面的球体是否连边,连边的方案数 因为T很大,十进制下有1000位,所以我们需要矩乘,而且还要加速快速幂,所以我们可以预处理出转移矩阵A的A10,A100,A1000...A1e1000A^{10},A^{100},A^{1000}...A^{1e1000} 那么我们要求T个小球体有多少种连接方原创 2017-04-11 17:16:13 · 479 阅读 · 0 评论 -
BZOJ3090: Coci2009 [podjela]
看了题不会做的时候应该膜题解首先,对于一条树边的两个村民,他们之间最多只会发生一次操作 那么最多只会有n-1次操作 因为n<=2000这个范围并不大,所以我们可以考虑按子树内的操作次数DP 设f[x][i]表示x的子树内,操作了i次,x能给出去的最多的钱数,如果f[x][i]<0,代表x的子树内还需要外界给(-f[x][i])的钱才能满足题目条件,然后就可以DP了,DP过程中需要最大化f[x]原创 2017-04-11 18:40:48 · 800 阅读 · 0 评论 -
BZOJ2436: [Noi2011]Noi嘉年华
因为时间的具体数值对安排活动没什么影响,可以先离散化时间 需要知道第i个活动Li∽RiLi\backsim Ri必须举办,活动较少的嘉年华活动数量的最大值,可以转化为(i=1∽Li)∽(j=Ri∽T)(i=1\backsim Li)\backsim(j=Ri\backsim T)的活动必须在同一个嘉年华举办的答案 设f[i][j]f[i][j]表示i∽ji\backsim j的活动在同一个嘉年华原创 2017-04-11 21:06:24 · 988 阅读 · 0 评论 -
BZOJ3566: [SHOI2014]概率充电器
这道题貌似我的做法比较奇怪(雾)?首先互不相关的两件事x,yx,y 同时发生的概率是P(x)+P(y)−P(x)∗P(y)P(x)+P(y)-P(x)*P(y)直接考虑怎么算进入充电状态元件的通电个数 因为若一棵子树需要对其他节点产生贡献或其他节点对这棵子树内的点产生贡献,都只能通过树根传递电流,所以设 f1[i]f1[i] 表示以 ii 为根的子树内有电流传导到ii的概率 f2[i]f2[i原创 2017-03-26 19:33:36 · 896 阅读 · 0 评论 -
BZOJ3134: [Baltic2013]numbers
因为若一个数是回文数,那么他中间的2个数相等或3个数一定是回文数 典型数位DP,f[i][x][y][j][k][l]表示DP到第i位,前1位是j,这一位是k,有多少非回文数,x表示是否前面达到上限,y表示是否前导0code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cm原创 2017-03-18 07:44:50 · 552 阅读 · 2 评论 -
BZOJ1019: [SHOI2008]汉诺塔
这题有一个挺厉害的DP解法一共有三根柱子,编号a,b,c 考虑一开始n个盘子堆在第a个柱子上, 他们全部移到另一柱子的充要条件时第n个盘子即最下的盘子移动 第n个盘子移动的充要条件是他上面的n-1个盘子全部移到另一柱子b,那么根据题目的约束,这时候只能移动第n个盘子到剩下的空柱子c上 移动后,根据约束,只能移动那n-1个盘子 有2种情况: 1:n-1个盘子移到c上,结束操作 2:n-1原创 2017-04-05 21:56:28 · 621 阅读 · 0 评论