![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
文章平均质量分 77
如题
Edward The Bunny
这个作者很懒,什么都没留下…
展开
-
树形DP小结
本文用于记录一些做过的树形dp题。原创 2022-11-24 23:18:18 · 296 阅读 · 0 评论 -
各种dp优化
一句话解释单调队列优化dp:如果一个人比你年轻,还比你强,那你就永远打不过他了.jpg。原创 2022-11-24 22:35:49 · 236 阅读 · 1 评论 -
决策单调性优化dp
1D/1D。原创 2022-10-26 22:03:39 · 352 阅读 · 0 评论 -
斜率优化dp
形如dp[i]=min{A(i)×B(j)+C(i)+D(j)}dp[i]=min{A(i)×B(j)+C(i)+D(j)}的转移方程可尝试使用斜率优化。(取maxmaxmax是类似的,本文不赘述)原创 2022-10-26 18:45:59 · 329 阅读 · 0 评论 -
NOIP复健计划——动态规划
dp原创 2022-10-10 13:58:30 · 352 阅读 · 0 评论 -
[XSY4197] Snow(树形DP)
我们在树上的每个点iii上放aia_iai个小点,初始时先让每个点单独减,这样要花费aia_iai之和的次数。然后尝试把某些减合并。一个点上面的小点至多可以向两个相邻的小点连边(这两个小点不能在同一个点上)。每连一条边,合并次数+1,答案-1。问题变成求一棵树内的最大合并次数。首先明确该问题满足最优子结构,即考虑以UUU为根的子树时,若U,VU,VU,V上的小点u,vu,vu,v可以合并,合并u,vu,vu,v 一定不比 不合并u,vu,vu,v以让fau,ufa_u,ufau,u合并 劣。原创 2021-11-19 15:20:36 · 277 阅读 · 0 评论 -
动态规划总结
二维费用”的条件多数是以这样一种隐含的方式给出的:最多只能取。不要求把背包装满:初始化时。原创 2021-11-19 13:44:22 · 231 阅读 · 0 评论 -
[AGC009B] Tournament(多叉树转二叉树后的最小可能深度)
传送门把aia_iai看成faifa_ifai,建出一棵多叉树,再把多叉树转成二叉树,转出来的每棵二叉树对应着一种比赛方式。以n=8,a2,...,8=1,1,2,4,3,3,3n=8,a_{2,...,8}=1,1,2,4,3,3,3n=8,a2,...,8=1,1,2,4,3,3,3为例,多叉树转出的二叉树深度=赛程二叉树的深度考虑求多叉树转二叉树后的最小可能深度:假设uuu的所有儿子vvv的子树都已经转化好了:现在要把uuu的子树转成二叉树:设dep[x]dep[x]dep[原创 2021-11-19 11:08:21 · 305 阅读 · 0 评论 -
[XSY] 选举(线段树优化dp)
选举//a[i]=1 or 0 or -1,表示i支持小奇 or 中立 or 支持魔法猪//sum[i]=a[1]+a[2]+...+a[i] //设dp[i]表示把1~i划分成若干区间,(小奇得票-魔法猪得票)的最大值 /*dp[i]=max { dp[j]+1 (sum[i]-sum[j]>0即sum[i]>sum[j]) dp[j] (sum[i]-sum[j]=0即sum[i]=sum[j]) dp[j]-1 (sum[i]-sum[j]<0即sum原创 2021-11-18 15:15:03 · 148 阅读 · 0 评论 -
[CF995F] Cowmpany Cowmpensation(树形dp,拉格朗日插值)
树形DP:设f[u][i]f[u][i]f[u][i]表示给uuu的子树分配工资,uuu点工资为iii的方案数f[u][i]=∏v∈sonu(∑j=1if[v][j])f[u][i]=\prod\limits_{v\in son_u}(\sum\limits_{j=1}^{i}f[v][j])f[u][i]=v∈sonu∏(j=1∑if[v][j])前缀和优化:设g[u][i]=∑j=1if[u][j]g[u][i]=\sum\limits_{j=1}^{i}f[u][j]g[u][i]=j=原创 2021-11-18 14:45:30 · 140 阅读 · 0 评论 -
[XXSY] 构树(prufer序列,树上连通块DP)
传送门CayleyCayleyCayley公式:一个完全图有nn−2n^{n-2}nn−2棵无根生成树(可用prufer序列证明)扩展CayleyCayleyCayley公式:被确定边分为大小为a1,a2,⋯ ,ama_1,a_2,\cdots, a_ma1,a2,⋯,am的连通块,则有nm−2∏i=1main^{m-2}\prod\limits_{i=1}^{m}{a_i}nm−2i=1∏mai种生成树我们可以强制生成树中的边是否与原树中的边相同。设dp[u][i][j]dp[u][i]原创 2021-11-17 14:42:07 · 505 阅读 · 0 评论 -
[POI2015] Pustynia(差分约数,线段树优化建图,拓扑)
传送门Description给定一个长度为n的正整数序列aaa,每个数都在111到10910^9109范围内,告诉你其中sss个数,并给出mmm条信息,每条信息包含三个数l,r,kl,r,kl,r,k以及接下来kkk个正整数x1,x2,...,xkx_1,x_2,...,x_kx1,x2,...,xk,表示a[l],a[l+1],...,a[r−1],a[r]a[l],a[l+1],...,a[r-1],a[r]a[l],a[l+1],...,a[r−1],a[r]里 a[x1],a[x2],..原创 2021-10-19 16:05:39 · 142 阅读 · 0 评论 -
[集训队作业2018]小Z的礼物(min-max容斥,插头dp)
传送门这种求 “取到所有物品的期望时间” 的题一般都用 min−maxmin-maxmin−max容斥 解决:设t(i,j)t(i,j)t(i,j)为取到格子(i,j)(i,j)(i,j)的期望时间,集合S=∪c(i,j)=′∗′{t(i,j)}S=\cup_{c(i,j)='*'}\{t(i,j)\}S=∪c(i,j)=′∗′{t(i,j)}那么根据min−maxmin-maxmin−max容斥有:max(S)=∑T⊆S,T≠∅(−1)∣T∣−1min(T)\max(S) = \sum_{原创 2021-10-12 20:36:28 · 266 阅读 · 0 评论 -
[XSY3343] 程序锁(DP)
先考虑如何判定一个填好的序列会不会gg:若∃p,q,使s′[i+1]=t′[j+1]=−1\exist p,q,使s'[i+1]=t'[j+1]=-1∃p,q,使s′[i+1]=t′[j+1]=−1且∑i=1ps′[i]+∑j=1qt′[j]≤0\sum_{i=1}^{p}s'[i]+\sum_{j=1}^{q}t'[j]\leq 0∑i=1ps′[i]+∑j=1qt′[j]≤0,则这个序列必gg。...原创 2021-10-04 21:02:05 · 142 阅读 · 0 评论 -
[XSY3383]多线程(笛卡尔树,DP)
%%%tjytjytjy的笛卡尔树做法:设dp(l,r,Amin,Bmin)dp(l,r,Amin,Bmin)dp(l,r,Amin,Bmin)为把c[l],c[l+1],...,c[r]c[l],c[l+1],...,c[r]c[l],c[l+1],...,c[r]划到A,BA,BA,B两线程中,且划到AAA线程的数>Amin>Amin>Amin,划到BBB线程的数>Bmin>Bmin>Bmin的方案数。我们找到ppp,满足c[p]=max{c[l],c[l+1],原创 2021-10-02 17:51:59 · 148 阅读 · 0 评论 -
[CSA49G][XSY3315] Bunny on Number Line (DP)
CSA49GXSY3315因为判断两串是否本质不同只看某几项是不是好数,与究竟是哪个好数无关,所以考虑转换一下题意:给出一个长度为aka_kak的01串SSS,第a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak项为1,其余项为0。现要用若干个SSS的前缀拼出串TTT,使得TTT中有nnn个1,以1结尾,并且任意两个1之间0的个数不超过mmm。问所有不同的TTT的长度之和为多少?SSS如果用01串表示,会很长,发现kkk很小,考虑换一种表示方式:设bi=ai−a原创 2021-09-30 09:52:44 · 123 阅读 · 0 评论 -
[CSA35G][XSY3318]Counting Quests (DP)
XSY3318CSA35G对于一个询问区间的集合SSS,求出每一个数被哪些区间覆盖了,记为SiS_iSi。要能保证猜出选中数,当且仅当每个数的SiS_iSi互不相同。考虑求出不满足要求的集合SSS的个数。首先可以观察得到SiS_iSi的一个性质:若a<b<c<da<b<c<da<b<c<d且Sa=Sc,Sb=SdS_a=S_c,S_b=S_dSa=Sc,Sb=Sd,则必有Sa=Sb=Sc=SdS_a=S_b=S_c=S_dSa=原创 2021-09-28 10:30:51 · 206 阅读 · 0 评论 -
[XSY] 绿色(圆方树、树形DP、树上差分)
绿色题意简述题解首先,每次修改完点权后,重新考虑一遍所有路径显然是不现实的,所以我们考虑求出经过每个点的两端同色的简单路径数,这样权值和容易统计和修改。接下来分析仙人掌上的简单路径性质。一条简单路径上的边,可以分为桥边和环上的边。过桥只有一种方法,而过同一个环有两个方向的环边可选。现在,我们选取一个关键点,强制简单路径必须通过该点。如果关键点在一个环上,且该简单路径在该环上的第一个和最后一个点均不是关键点,那么该环只有一个方向的环边可选。建立原仙人掌的圆方树。如果定义方点贡献 2 种方案,原创 2021-03-29 20:40:26 · 179 阅读 · 0 评论 -
[XSY] 计数(DP,NTT,分治)
计数考虑转化题目,变为网格上有若干个点,要从(0,0)(0,0)(0,0)走到(n,an+1)(n,a_{n+1})(n,an+1) ,每一步只能往右走一步或往上走一步,且若当前在(i,j)(i,j)(i,j) ,必须满足0≤j≤ai+10\leq j\leq a_{i+1}0≤j≤ai+1,其中an+1=ana_{n+1}=a_nan+1=an 。要对每个kkk求出有多少条恰走过kkk次形如(i,ai+1)→(i+1,ai+1)(i,a_{i+1})\to(i+1,a_{i+1})(i,ai+原创 2021-03-23 22:05:16 · 287 阅读 · 0 评论 -
[XSY] 传统游戏(DP、容斥)
应该不难看出这是道DP题,关键是如何保证所选的数不重复且无序看到题,第一想法是设dp[k][s]dp[k][s]dp[k][s]表示选了kkk个数,当前异或和为sss的方案数,但这样产生一个问题:要如何保证所选的数不重复且无序呢?一种方法是修改状态:我们增设一维iii,dp[i][k][s]dp[i][k][s]dp[i][k][s]表示从≤i\leq i≤i的范围中选了kkk个数,当前异或和为sss的方案数。选第k+1k+1k+1个数时,理论上我们可以选一个≤i\leq i≤i的数,也可以选一个&g原创 2021-03-19 10:37:12 · 168 阅读 · 0 评论 -
[XSY] 树与图(树形DP、生成函数、分治NTT、重链剖分)
树与图 如果真的在图上跑算法,那么光建图复杂度就O(n2logn)O(n^2logn)O(n2logn)了,这显然不可行。所以一定要把 在图上的操作 转换成 在树上的操作 在图上删去点u,相当于在树上删去u到根节点的链,并把u的整棵子树删掉 如果我们枚举算法可能产生的所有过程,然后再去求每个过程对应的删点次数,那么光枚举过程就已经可以T爆了 所以我们只能枚举删点次数,然后求出该删掉次数对应多少种过程 这可以用树形DP实现,时间复杂度O(n3)O(n^3)O(n3) 可以想到用生成函数进一步优化原创 2021-03-17 22:43:04 · 223 阅读 · 0 评论 -
[XSY] 简单的博弈题(博弈+dp+组合数+容斥)
记w=⌊m+12⌋记w=\left\lfloor\frac{m+1}{2}\right\rfloor记w=⌊2m+1⌋=∑i=wmf[i]∑k=wi(−1)i−kCik=\sum_{i=w}^{m}f[i]\sum_{k=w}^{i}(-1)^{i-k}C_{i}^{k}=∑i=wmf[i]∑k=wi(−1)i−kCik=∑i=wmf[i]∑p=0i−w(−1)pCii−p=\sum_{i=w}^{m}f[i]\sum_{p=0}^{i-w}(-1)^{p}C_{i}^{i-p}=∑i=wmf原创 2021-03-16 10:27:28 · 165 阅读 · 0 评论 -
[XSY] 宝藏(LCS,DP)
宝藏首先,这个问题等价于给定两个字符串S,T ,每次询问LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y])。对每个询问重新求一遍LCSLCSLCS显然不现实,又因为x,yx,yx,y都是连续变化的,我们考虑探讨LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y])与LCS(S[1,n],T[x,y−1])LCS(S[1,n],T[x,y-1])LCS(S[1,n],T[x,y−1])的关系原创 2021-03-10 14:44:02 · 153 阅读 · 0 评论 -
[XSY] PQ树(区间DP)
PQ树对于非叶子节点,它只能调换它的儿子的顺序,却不能调换整颗子树的顺序合法的PQ树都能表示出1,2,3,…,n 这个排列有以上两点可以得出:PQ树的每棵子树对应的一定都是一段连续的数字区间考虑区间DP,设f(l,r)f(l,r)f(l,r)表示数字l~r构成一棵PQ树的方案数数字l~r 能够构成一棵子树 当且仅当 数字l~r 在题目给出的所有排列中都在一段连续区间中,我们定义这样的 [l,r] 是“好的”若[l,r]不是"好的",f(l,r)=0f(l,r)=0f(l,r)=0若[l,r]原创 2021-03-09 18:48:49 · 438 阅读 · 0 评论 -
状压DP
状压DP,是利用计算机二进制的性质来描述状态的一种DP方式,其特点是规模比较小,n一般小于15,而且一般只有两种决策,目的是防止爆空间学习前需要先了解基本的位运算操作然后我们来看一道例题:题目:求每一种放法的背包价值定义状态状态应该是这n件物品的放与不放的情况很容易想到的是开个n维数组,第i个维度的下标如果是1的话代表放第i件物品,0的话代表不放第i件物品但是这样很容易造成空间浪费,而且多维数组也不好开但如果用1和0代表放和不放,即用二进制表示所有物品的放与不放的情况,就只有一个维度了原创 2021-03-08 21:16:59 · 183 阅读 · 0 评论 -
匹配(树形DP)
传送门题目描述:有一张无向联通图 G=⟨V,E⟩ ,其中顶点数 |V|=n ,边数 |E|=n−1 。求有多少种方案使得删边后残余图中的最大匹配数恰好为 m 的倍数。题解:这道题看起来是求最大匹配,其实关系不大,正解是树形DP定义一个数组dp[i][j][k], 其中i表示节点,j表示i的子树中的最大匹配数%m,k表示i是否与其子节点匹配.接下来推一下合并两颗子树u,v的递推式即可注意几个细节:1.用快读,否则会TLE2.尽量少取余,否则会很慢3.有2n条边,我一开始就因为数组开小原创 2021-03-08 21:12:21 · 153 阅读 · 0 评论 -
[ZJOI2005]午餐(贪心+dp)
首先若只有一个窗口,利用贪心,按吃饭时间从大到小排序即可正确性证明:定义 eat[i] = 第i个人的吃饭时间,time[i] = 第i个人的打饭时间延长时间T[i]=max(eat[i]- ∑j=i+1ntimej\sum\limits_{j=i+1}^ntime_jj=i+1∑ntimej ,0)最后的集合时间为∑j=1ntimej\sum\limits_{j=1}^ntime_jj=1∑ntimej + max{T[i] , i∈[1,N]}将人按照eat大小从大到小排序后,易证原创 2021-03-05 21:28:31 · 152 阅读 · 0 评论 -
[AGC014D] Black and White Tree(树形DP,博弈)
每次找到所有叶子节点,把它们的父亲染白,自己染黑。这个时候染完的叶子节点及其父亲节点对树的其他部分已无影响 ,可以直接删掉。那么只需要判断树的其他部分是否有先手必胜策略即可。用递归遍历。边界条件:若树为单一节点先手必胜。代码:#include<iostream>#include<cstdio>using namespace std;const int N=1e5+5;struct Edge{ int v,nxt;}e[N<<1];int n,f原创 2021-03-05 21:25:52 · 278 阅读 · 0 评论 -
CF1120D Power Tree(树形DP/构造+差分+最小生成树)
解法一:树形DP个人觉得这个方法是比较可能想到的,但是输出方案很恶心先转换题意:“无论怎样规定叶子的初始点权,都可以通过操作你选择的点来让所有叶子的点权清空”意味着每个叶子节点都可以通过一系列操作单独+1、-1模拟一下就可以发现,以u为根的子树中,要想通过控制 uuu 或 uuu的祖先(不管是 uuu 还是 uuu的祖先 都同时覆盖了子树内的所有叶子节点)使子树内所有叶子节点均可以单独+1、-1,至多一个叶子节点未被覆盖,且被覆盖的叶子节点一定要可以单独+1、-1那么状态定义就很显然了:f原创 2021-03-05 21:20:40 · 410 阅读 · 0 评论 -
[XSY] 线图(树形DP、分类讨论)
如图,每个L(L(T))上的点对应T上的一条三点链 在连接L(L(T))上两点,当且仅当两点代表的三点链在T上有共边,且边权为 共边边权*2+非共边1边权+非共边2边权 在L(L(T))上从点u走到点v,等价于[ ]...原创 2021-03-05 14:57:39 · 225 阅读 · 0 评论 -
UOJ284 快乐游戏鸡(树上动态规划问题、长链剖分+单调栈)
参考文章:https://vfleaking.blog.uoj.ac/blog/2292https://www.cnblogs.com/penth/p/9801945.htmlhttps://blog.csdn.net/qq_42555009/article/details/100934540https://blog.csdn.net/zxyoi_dreamer/article/details/101705010https://blog.csdn.net/Mr_wuyongcong/article原创 2021-02-04 17:04:28 · 989 阅读 · 1 评论 -
[USACO]Sprinklers 2: Return of the Alfalfa P(网格DP)
思路:由题目易得:网格内种植的两种植物形成了一条 左上—右下 的分界线,考虑将问题转化成 DP求出有多少条合法的分界线我们注意到:分界线上的点都必须放洒水器,且所放洒水器有唯一选择;其他的可以放洒水器的点则都有2种选择(放或不放)。所以,总方案数=合法分界线条数*(2∧网格中可放洒水器的点的数量)/(2∧分界线上折点数量)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516111409144.PNG?x-oss-process=image/wate原创 2020-05-26 22:44:46 · 186 阅读 · 0 评论 -
【BZOJ3566】【SHOI2014】概率充电器(概率与期望DP)
#include<iostream>#include<cstdio>#include<cstring>#include<cctype>#include<cmath>using namespace std;const int N=500010;inline int read(){ int x=0,f=1; char...原创 2019-08-17 09:36:26 · 122 阅读 · 0 评论 -
[XSY] 相似(DP套DP)
在看这道题前,有必要先看一下DP套DP的入门题[uoj3864]Hero meet devil,附上两篇写得不错的题解:https://blog.csdn.net/Ike940067893/article/details/87863041https://www.cnblogs.com/RabbitHu/p/BZOJ3864.html设阀值为mmm设 lcsi,jlcs_{i,j}lcsi,j 表示 S[1...i]S[1...i]S[1...i] 与 T[1...j]T[1...j]T[1...j原创 2021-03-04 20:14:33 · 285 阅读 · 1 评论 -
hihocoder1147 时空阵(bfs树+DP)
设f[i][j][k]f[i][j][k]f[i][j][k]为前iii层一共使用jjj个节点,其中第iii层有kkk个节点的合法方案,nnn在第LLL层i=0:i=0:i=0:f[0][1][1]=1f[0][1][1]=1f[0][1][1]=10<i<L:0<i<L:0<i<L:f[i][j][k]=∑f[i−1][j−k][x]×(2x−1)k×2Ck2×Cn−(j−k)−1kf[i][j][k]=\sum f[i-1][j-k][x]\times(2^x转载 2021-01-29 09:27:03 · 94 阅读 · 0 评论 -
Top Secret Task(dp+滚动数组)
传送门: 题目dp[i][j][k] 表示 考虑到第i个数 计算前j个数的和 进行了k次操作则有若不把第i个数放入前j个数中dp[i][j][k] = dp[i-1][j][k] 若把第i个数放入前j个数中至少需要把第i个移到第j个,即进行i-j次操作 if(k >= i-j) dp[i][j][k] = dp[i-1][j-1][k-...原创 2019-05-20 20:41:08 · 382 阅读 · 0 评论