dp专题
关于dp的一些收集
SC.ldxcaicai
我很菜=_=
展开
-
codeforces739E. Gosha is hunting(dp凸优化)
传送门题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi,YYY道具移走第iii个道具概率为uiu_iui。对于每个物品每种道具最多用一次且只能被移走一次,现在问对于道具的所有分配方案中移走物品的总个数的期望最大值是多少。思路:有一个很显然的O(n3)dp:fi,j,kO(n^3)dp:f_{i,j,k}O(n3)dp:fi...原创 2019-03-12 19:25:11 · 253 阅读 · 0 评论 -
codeforces833B. The Bakery(线段树优化dp)
传送门线段树优化dpdpdp入门题。要求把nnn个数分成kkk段,每段价值为里面不相同的数的个数,求所有段的价值之和最大值。n≤35000,k≤50n\le35000,k\le50n≤35000,k≤50先考虑直接暴力dpdpdp,fj,if_{j,i}fj,i表示把前iii个分成jjj组的最优值。显然fj,i=maxj−1≤k≤i−1{fj−1,k+W(k+1,i)}f_{j,i}...原创 2019-03-09 10:51:51 · 457 阅读 · 0 评论 -
bzoj3075: [Usaco2013]Necklace(kmp+dp)
传送门题意简述:给出S,TS,TS,T两个字串,∣S∣≤10000,∣T∣≤1000|S|\le10000,|T|\le1000∣S∣≤10000,∣T∣≤1000,问至少从SSS中删去几个字符能够使得TTT不是修改后的SSS的字串。思路:考虑正难则反转化问题。只需要求所有使得TTT不为SSS字串的SSS的字符数最大值。于是设计状态fi,jf_{i,j}fi,j表示SSS中前iii个...原创 2019-03-01 21:47:41 · 309 阅读 · 0 评论 -
bzoj5466: [Noip2018]保卫王国(链分治+ddp)
传送门题意简述:mmm次询问,每次规定两个点必须选或者不选,求树上的带权最小覆盖。思路:考虑链分治+ddpddpddp仍然是熟悉的套路,先考虑没有修改的状态和转移:令fi,0/1f_{i,0/1}fi,0/1表示强制iii不选/选时iii为根子树的带权最小覆盖。显然有:fi,0=∑v∈sonfv,1f_{i,0}=\sum_{v\in son}f_{v,1}fi,0=∑v∈s...原创 2019-02-16 09:59:53 · 537 阅读 · 0 评论 -
bzoj5210: 最大连通子块和(链分治+ddp)
传送门题意:支持单点修改,维护子树里的最大连通子块和。思路:扯皮:bzojbzojbzoj卡常差评。网上的题解大多用了跟什么最大子段和一样的转移方法。但是我们实际上是可以用矩阵转移的传统ddpddpddp写法来做这道题的。由于我推出来矩阵是3∗33*33∗3的因此常数巨大gggggg了,因此蒟蒻博主只能提供思路和一份TLETLETLE的代码。正题:一道考虑链分治+dpdpdp套...原创 2019-02-15 18:51:07 · 473 阅读 · 0 评论 -
codechef Favourite Numbers(二分+数位dp+ac自动机)
传送门题意:给444个整数L,R,K,nL,R,K,nL,R,K,n,和nnn个数字串,L,R,K,数字串大小≤1e18,n≤65L,R,K,数字串大小\le1e18,n\le65L,R,K,数字串大小≤1e18,n≤65问[L,R][L,R][L,R]中第KKK小的拥有nnn个数字串中至少一个串作为子串的数。思路:一看就要二分答案,现在考虑统计[L,R][L,R][L,R]中有多少个...原创 2019-02-15 15:37:51 · 194 阅读 · 0 评论 -
bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)
传送门题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9,m≤2e7,p≤100)(n\le1e9,m\le2e7,p\le100)(n≤1e9,m≤2e7,p≤100)。思路:首先因为只需要是ppp的倍数,因此可以看成全局和对ppp取模为000方案数...原创 2019-02-11 12:45:45 · 258 阅读 · 0 评论 -
bzoj4767: 两双手(组合数学+容斥dp)
传送门题意简述:你要从(0,0)(0,0)(0,0)走到(ex,ey)(ex,ey)(ex,ey),每次可以从(x,y)(x,y)(x,y)走到(x+ax,y+ay)(x+ax,y+ay)(x+ax,y+ay)或者(x+bx,y+by)(x+bx,y+by)(x+bx,y+by),其中有nnn个障碍点问方案数,所有出现的值的绝对值≤500\le500≤500思路:从(0,0)(0,0)(0,...原创 2019-02-11 11:37:43 · 292 阅读 · 0 评论 -
bzoj2560: 串珠子(状压dp+简单容斥)
传送门题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和。思路:fif_ifi表示保证集合iii中所有点都连通其余点随意的方案数。gig_igi表示只考虑集合iii中所有点的状态的子图的权值和。我们先预处理出ggg数组,然后考虑递推fff数组。显然fif_ifi是等于gig_igi扣掉一些东西的,扣掉的应该就是不连通的情况...原创 2019-02-09 12:23:43 · 308 阅读 · 0 评论 -
bzoj1487: [HNOI2009]无归岛(仙人掌+树形dp)
传送门人脑转化条件过后的题意简述:给你一个仙人掌求最大带权独立集。思路:跟这题没啥变化好吗?再写一遍加深记忆吧。就是把每个环提出来分别枚举环在图中的最高点选还是不选分别dpdpdp一下即可,时间复杂度O(n+m)O(n+m)O(n+m)代码:#include<bits/stdc++.h>#define ri register intusing namespace std...原创 2019-02-07 21:18:35 · 168 阅读 · 0 评论 -
bzoj4784: [Zjoi2017]仙人掌(仙人掌+树形dp)
传送门题意:给一个无向连通图,问给它加边形成仙人掌的方案数。思路:先考虑给一棵树加边形成仙人掌的方案数。这个显然可以做树形dp。fif_ifi表示把iii为根的子树加边形成仙人掌的方案数。然后有两种情况:iii点没有父亲iii点有父亲对于第一种情况即iii是树根的情况,显然fi=(∏fv)∗g∣sonp∣f_i=(\prod f_v)*g_{|son_p|}fi=(∏f...原创 2019-02-07 20:55:57 · 188 阅读 · 0 评论 -
bzoj4316: 小C的独立集(仙人掌+树形dp)
传送门题意:给出一个仙人掌森林求其最大独立集。思路:如果没有环可以用经典的树形dpdpdp解决。fi,0/1f_{i,0/1}fi,0/1表示第iii个点不选/选的最大独立集。然后fi,0+=max{fv,0,fv,1},fi,1+=fv,0f_{i,0}+=max\{f_{v,0},f_{v,1}\},f_{i,1}+=f_{v,0}fi,0+=max{fv,0,fv,1},f...原创 2019-02-07 19:16:52 · 323 阅读 · 0 评论 -
NOIP训练 旅行(轮廓线dp)
传送门题意简述:给一个n∗mn*mn∗m的有障碍的网格图,问你从左上角走到左下角并覆盖所有可行格子的路径条数。思路:路径不是很好算。将图改造一下,在最前面添两列,第一列全部能通过,第二列只有最上面的和最下面的可以通过,就转化成了求回路方案数。代码:#include<bits/stdc++.h>#define ri register int#define change...原创 2019-01-24 21:52:21 · 137 阅读 · 0 评论 -
bzoj3125: CITY(轮廓线dp)
传送门题意简述:给一个n∗mn*mn∗m的网格图,有的格子不能走,有的格子只能竖着走,有的格子只能横着走,问用一条回路覆盖所有能走的格子的方案数。思路:就是简单的轮廓线dpdpdp加了一点限制而已,考虑几个特判。只能横着走的,限制它必须有左插头,必须没有上插头只能竖着走的,限制它必须有右插头,必须没有左插头然后就差不多了。然后博主这个废柴因为hash表写错了一个地方调了1h代...原创 2019-01-24 20:27:19 · 170 阅读 · 0 评论 -
bzoj2310: ParkII(轮廓线dp)
传送门题意简述:给一个m*n的矩阵,每个格子有权值V(i,j) (可能为负数),要求找一条路径,使得每个点最多经过一次且点权值之和最大。思路:我们将求回路时的状态定义改进一下。现在由于求的是路径说明有可能出现单插头的情况,于是我们用四进制表示,000对应无插头,111对应左括号插头,222对应右括号插头,333对应单插头。然后多了一些很多转移,于是我把找左右插头的函数给封装了起来 。细...原创 2019-01-24 11:10:22 · 207 阅读 · 0 评论 -
hdu3377 Plan(轮廓线dp)
传送门题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9。思路:考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因此需要一点巧妙地转化。我们在加入初始值时规定第一个位置可以来一个插头,然后最后统计到最后一个点的时候特判有没有多余的插头即可。注意在转移过程中如果有连上两个插头刚好会产生回路的状态要舍弃掉。代...原创 2019-01-23 16:50:52 · 206 阅读 · 0 评论 -
hdu1964 Pipes(轮廓线dp)
传送门题意简述:给一个没有障碍的网格图,任意两个格子连通需要花费一定代价,现在求一条覆盖所有格子的哈密顿回路的总权值的最小值。思路:跟这道题一毛一样,除了把求和变成求最小值以外。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;inline int read(){ int ans...原创 2019-01-23 15:02:34 · 231 阅读 · 0 评论 -
hdu1693 Eat the Trees(轮廓线dp)
传送门题意简述:给一个有障碍的网格图,问用若干个不相交的回路覆盖所有非障碍格子的方案数。思路:轮廓线dpdpdp的模板题。同样是讨论插头的情况,只不过没有前一道题复杂,不懂的看代码吧。代码:#include<bits/stdc++.h>#include<tr1/unordered_map>#define ri register intusing names...原创 2019-01-23 14:59:30 · 211 阅读 · 0 评论 -
ural1519 Formula 1(轮廓线dp)
传送门轮廓线dpdpdp模板题。题意简述:给一个放有障碍的网格图,问有多少种方法能使所有非障碍格子都在同一条哈密顿回路上面。考虑用括号序列的写法来状压这个轮廓线。用000表示没有插头,111表示有插头,且是左括号,222表示有插头,且是右括号。然后分类讨论一波:对于当前的格子左边,上边都有插头。只有左边有插头。只有上边有插头。左边,上边都没有插头。其中第一种还要分类讨论一...原创 2019-01-23 14:53:59 · 408 阅读 · 0 评论 -
bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏(spfa+dp)
传送门题意简述:nnn个怪物,对于编号为iii的怪物可以选择用aia_iai代价将其分裂成另外的bib_ibi个怪物或者用cic_ici代价直接消灭它,现在问消灭编号为1的怪物用的最小代价。思路:考虑dpdpdp,消灭iii号怪物的代价fi=min{ci,ai∑fv},v指分裂的怪物f_i=min\{c_i,a_i\sum f_v\},v指分裂的怪物fi=min{ci,ai∑fv...原创 2019-01-22 11:57:51 · 223 阅读 · 0 评论 -
bzoj3653: 谈笑风生(长链剖分优化dp)
传送门长链剖分优化dpdpdp水题。题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数。a,b是c的祖先a,b的距离不超过k思路:考虑单独处理每一个询问怎么做。显然a,ba,ba,b的位置关系有两种。bbb是aaa的祖先,此时ccc一定在aaa子树中,这种情况的三元组个数是(sizea...原创 2019-01-19 17:08:28 · 472 阅读 · 0 评论 -
loj#6515. 贪玩蓝月(线段树分治+01背包)
传送门题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(wi,vi)(w_i,v_i)(wi,vi),支持询问从当前队列中选取若干个元素是的他们的和对 MODMODMOD 取模后余数在[l,r][l,r][l,r]中,使得这些装备的战斗力之和最大。思路:直接看询问貌似可以用010101背包。然后由于这个双端队列只能在队首和队尾弹入弹出,那么考虑按时间线段树分...原创 2019-01-13 19:59:37 · 462 阅读 · 0 评论 -
bzoj4543: [POI2014]Hotel加强版(长链剖分+dp)
传送门代码:长链剖分好题。题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数。思路:先考虑dpdpdp。fi,jf_{i,j}fi,j表示iii子树中离iii距离为jjj的点数,gi,jg_{i,j}gi,j表示iii子树中所有满足dist(lca(u,v),i)−dist(lca(u,v),i)=jdist(lca(u,v),i)-dist(l...原创 2019-01-08 17:46:02 · 481 阅读 · 0 评论 -
洛谷P4719 【模板】动态dp(链分治+ddp)
传送门ddpddpddp模板题。题意简述:给你一棵树,支持修改一个点,维护整棵树的最大带权独立集。思路:我们考虑如果没有修改怎么做。貌似就是一个sbsbsb树形dpdpdp,fi,0f_{i,0}fi,0表示不选iii的最大值,fi,1f_{i,1}fi,1表示选iii的最大值。那么可以这样从iii的儿子vvv转移过来:fp,0+=max{fv,0,fv,1},fp,1+=fv...原创 2019-01-04 20:10:32 · 359 阅读 · 0 评论 -
poj3046 Ant Counting(生成函数+dp)
传送门生成函数基础题。题意:给出nnn个数以及它们的数量,求从所有数中选出i∣i∈[L,R]i|i\in[L,R]i∣i∈[L,R]个数来可能组成的集合的数量。直接构造生成函数然后乘起来f(x)=∏i=1n(1+x+x2+...+xtimei)f(x)=\prod_{i=1}^n(1+x+x^2+...+x^{time_i})f(x)=∏i=1n(1+x+x2+...+xtimei)然...原创 2019-01-02 13:48:28 · 195 阅读 · 0 评论 -
NOIP训练 czy的后宫6(线性dp)
传送门题意简述:给一个nnn个数的数列,你可以把它最多分成mmm段,求每段数之和的最大值的最小值,以及满足这个最小值的时候划分数列的方案数。思路:第一个问题是二分经典问题,不妨设其答案为limlimlim。现在考虑dpdpdp第二个问题。我们定义状态fi,jf_{i,j}fi,j表示把前iii个数划成jjj段且满足题意的方案数。那么就有状态转移方程:fi,j=∑psum(p,i)≤l...原创 2018-12-31 13:58:29 · 168 阅读 · 0 评论 -
NOIP训练 czy的后宫5(树形dp)
传送门题意:给一棵有根树,树有点权,最多选出mmm个点,如果要选一个点必须先选其祖先,问选出来的点权和最大值是多少。直接背包转移就行了。代码...原创 2018-12-31 13:00:48 · 220 阅读 · 0 评论 -
codeforces 940E. Cashback(线性dp)
传送门题意:给出一个nnn个数的序列,要求将序列分成若干段,对于一段长度为kkk的自动删去最小的⌊kc⌋\left \lfloor \frac{k}{c} \right \rfloor⌊ck⌋个数,求删去之后剩下的数的和的最小值。思路:显然每个被分开的段长不超过ccc时最优(不然会有其他更小的局部最小值来替代不够优),于是dpdpdp转移一下就行了:当前这个位置跟之前的分在一起:fi=...原创 2018-12-29 21:29:20 · 220 阅读 · 0 评论 -
codeforces 1092F. Tree with Maximum Cost(换根dp)
传送门sbsbsb树形dpdpdp题。题意简述:给出一棵边权为1的树,允许选任意一个点vvv为根,求∑i=1ndist(i,v)∗ai\sum_{i=1}^ndist(i,v)*a_i∑i=1ndist(i,v)∗ai的最大值。直接统计出子树的权值和转移就行了。代码:#include<bits/stdc++.h>#define ri register intusin...原创 2018-12-19 23:28:36 · 348 阅读 · 0 评论 -
codeforces 922E. Birds(分组背包)
传送门蒟蒻净做些水题还请大佬见谅没错这又是个一眼的分组背包。题意简述:有n棵树,每只树上有aia_iai只鸟,第iii棵树买一只鸟要花cic_ici的钱,每买一只鸟可以奖励bbb块钱,从一棵树移动到下一棵树可以奖励xxx块钱,最初有www块钱,求买下的鸟的数量的最大值。由于钱数很大,考虑按照选择的鸟的方案数来进行dpdpdp。我们定义状态fi,jf_{i,j}fi,j表示走过前i...原创 2018-12-14 23:48:50 · 372 阅读 · 0 评论 -
codeforces 935D. Fafa and Ancient Alphabet(概率dp)
传送门概率dp水题。题意简述:给你数字表的大小和两个数列,数列中为0的数表示不确定,不为0的表示确定的,求第一个数列字典序比第二个数列大的概率。fif_ifi表示第i ni~ ni n位第一个数列比第二个数列大的概率。然后分是否为0的情况讨论一下就行了。代码:#include<bits/stdc++.h>#define ri register in...原创 2018-12-12 11:51:17 · 241 阅读 · 0 评论 -
codeforces 931E. Game with String(概率dp)
传送门感觉这题难点在读懂题。题目简述:给你一个字符串s,设将其向左平移k个单位之后的字符串为t,现在告诉你t的第一个字符,然后你可以另外得知t的任意一个字符,求用最优策略猜对k的概率。解析:预处理出一个数组cnti,j,kcnt_{i,j,k}cnti,j,k表示一段字串开头为iii,结尾为jjj,字串长度为k+1k+1k+1的字串数量。然后如果cnti,j,k=1cnt_{i,j,...原创 2018-12-12 11:14:11 · 236 阅读 · 0 评论 -
codeforces 946D. Timetable(背包)
传送门题意简述:有一个人上n天课,每天有m个小时的时间安排表(一个01串),为1表示要上课,否则不上课,求出如果可以最多翘kkk节课这nnn天在校待的总时间的最小值(一天必须在所有课上完后才能离开)。背包sbsbsb题。注意可以从首尾分别逃课。对于每天的上课情况我们都预处理出一个数组aia_iai表示这天逃iii节课在校的最少时间。然后跑分组背包就可以了。实际上可以滚动数组优化一波...原创 2018-12-08 18:02:04 · 269 阅读 · 0 评论 -
2018.11.08 UVA11021 Tribles(概率dp)
传送门概率dpdpdp简单题。设f[i]f[i]f[i]表示第iii天的答案。然后枚举ppp数组从fi−1f_{i-1}fi−1转移过来就行了。显然有fi=∑j=0npj∗(fi−1)jf_i=\sum_{j=0}^np_j*(f_{i-1})^jfi=∑j=0npj∗(fi−1)j代码:#include<bits/stdc++.h>using namespac...原创 2018-11-08 23:40:36 · 160 阅读 · 0 评论 -
2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
传送门显然只要所有点的权值加起来是0就一定有一组合法解。然后当成树随便构造就行了。至于非树边全部赋值为0就行。代码原创 2018-11-08 23:10:03 · 142 阅读 · 0 评论 -
2018.11.07 hdu1465不容易系列之一(二项式反演)
传送门其实标签只是搞笑的。没那么难。二项式反演只是杀鸡用牛刀而已。这道题也只是让你n≤20n\le20n≤20的错排数而已。还记得那个O(n)O(n)O(n)的递推式吗?没错那个方法比我今天用的要快一些。言归正传。回忆一下二项式反演的式子:fn=∑i=0n(ni)gif_n=\sum_{i=0}^n\binom{n}{i}g_ifn=∑i=0n(in)gi=>g...原创 2018-11-07 19:34:49 · 280 阅读 · 0 评论 -
2018.11.07 NOIP训练 lzy的游戏(01背包)
传送门考虑对于每次最后全部选完之后剩下的牌的集合都对应着一种构造方法。一个更接地气的说法:设消耗的牌数为ttt,如果使用的牌的lll值之和也为ttt,则对应着一种构造方式让这种情形成立。于是做01背包就可以了。代码...原创 2018-11-07 19:24:49 · 171 阅读 · 0 评论 -
2018.11.07 NOIP模拟 异或(数位dp)
传送门对于每个二进制位单独考虑贡献。然后对于两种情况分别统计。对于第二种要用类似数位dpdpdp的方法来计算贡献。代码原创 2018-11-07 19:20:48 · 329 阅读 · 0 评论 -
2018.11.07 codeforces559C. Gerald and Giant Chess(dp+组合数学)
传送门令f[i]f[i]f[i]表示对于第iii个棋子,从(1,1)(1,1)(1,1)出发到它不经过其它棋子的方案数。于是我们假设(h,w)(h,w)(h,w)有一个棋子,求出它的fff值就可以了。然后考虑容斥转移fff数组。根据定义,我们求出从(1,1)(1,1)(1,1)出发到它的总方案数,再减去经过了其它棋子的方案数。然后再考虑如何才会补充不漏。发现从之前每一个fff转移过来就...原创 2018-11-07 08:24:38 · 167 阅读 · 0 评论 -
2018.11.06 bzoj2287: 【POJ Challenge】消失之物(背包)
传送门先假设所有物品都能用,做01背包求出方案数。然后枚举每个点,分类讨论扣掉它对答案的贡献。代码:#include<bits/stdc++.h>using namespace std;const int N=2e3+5;int n,m,w[N],f[N],g[N];inline int read(){ int ans=0; char ch=getcha...原创 2018-11-06 22:04:36 · 124 阅读 · 0 评论