dp
文章平均质量分 74
秋天俯身采种子
我在想,飞蛾扑火时一定是极快乐幸福的。
展开
-
2021牛客暑期多校训练营4 D-Rebuild Tree(prufer序列+树形dp)
D-Rebuild TreePrufer 是这样建立的:每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点。重复n−2n-2n−2次后就只剩下两个结点,算法结束。(为什么不是n−1n-1n−1次呢?因为第n−1n-1n−1次操作序列记录下的节点一定是nnn)一个 nnn个点 mmm条边的带标号无向图有 kkk个连通块。我们希望添加k−1k-1k−1条边使得整个图连通。方案数为nk−2⋅∏i=1ksin^{k-2}·\prod_{i=1}^{k}s_ink−2⋅i=1∏ksi原创 2021-07-29 01:47:56 · 243 阅读 · 0 评论 -
codeforces1497 E. Square-free division(数学+dp)
#include<iostream>using namespace std;constexpr int N=200010;int n,k,a[N],pre[10000010];int main(){ ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); int T=1; cin>>T; while(T--) { cin>>n>&原创 2021-03-18 21:04:25 · 374 阅读 · 1 评论 -
P6240 好吃的题目(分治+背包)
P6240 好吃的题目类似于线段树分治,在每个节点预处理[l,mid],[mid+1,r][l,mid],[mid+1,r][l,mid],[mid+1,r]的背包,然后询问即可一般代码就类似下面的写法,但是此题有点卡空间于是稍微优化了一下空间。时间复杂度O{nlognmax(hi,ti)}O\{n\log n\max(h_i,t_i)\}O{nlognmax(hi,ti)}#include<bits/stdc++.h>using namespace std;using ll原创 2021-03-08 22:26:15 · 218 阅读 · 0 评论 -
2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)
2287. 【POJ Challenge】消失之物这题的思想和P4564 [CTSC2018]假面优化的思想一样,应该反过来说,假面那个题应该是借鉴这题的思路。显然不能枚举每个物品消失O(n)O(n)O(n),然后跑背包O(nm)O(nm)O(nm)预处理dpfjf_jfj表示nnn个物品装满体积为jjj的背包的方案数。gi,jg_{i,j}gi,j表示除了第iii个物品其他n−1n-1n−1个物品装满体积为jjj的背包的方案数。显然fj=gi,j+gi,j−vif_j=g_{i,j}+g_原创 2021-03-05 18:13:33 · 301 阅读 · 1 评论 -
P4564 [CTSC2018]假面(期望)
P4564 [CTSC2018]假面#include<cstring>#include<iostream>using namespace std;using ll=long long;constexpr ll mod=998244353;ll qmi(ll a,ll b){ ll res=1; while(b) { if(b&1) res=res*a%mod; a=a*a%mod; b>原创 2021-03-05 00:14:10 · 218 阅读 · 1 评论 -
HDU4035 Maze(树上期望)
Maze#include<cstdio>#include<cstring>using namespace std;constexpr int N=10010;constexpr double eps=1e-10;int h[N],e[2*N],ne[2*N],idx;void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;}int d[N],n;double K[N],E[N],T[N],A[N],B[N],C[原创 2021-03-04 12:40:09 · 327 阅读 · 2 评论 -
codeforces1208 F. Bits And Pieces(SOS DP)
heyuhhh高维前缀和总结SOS DPSOS Dynamic Programming [Tutorial]之前写过相关的题目枚举子集dp枚举子集F[mask]=∑i∈maskA[i],i&mask=iF[mask]=\sum_{i\in mask}A[i],i\&mask=iF[mask]=i∈mask∑A[i],i&mask=i方法1,O(4n)O(4^n)O(4n)暴力枚举for(int mask=0;mask<1<<N;mask++)原创 2021-03-01 22:08:14 · 169 阅读 · 0 评论 -
P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)
[八省联考2018]林克卡特树题目大意:给定一棵有负权边的树,现在必须恰好删去kkk条边,并加上恰好kkk条权值为000的边,要求最大化它的直径长度。首先考虑删去KKK条边的效果:把整棵树变成k+1k+1k+1个连通块然后用0权变把这几个连通块连起来,当k+1k+1k+1个连通块已经确定后有个显然的结论:用kkk条边把他们连接后的最大直径长度就是k+1k+1k+1个连通块的直径代数求和。方法是将k+1k+1k+1条直径首位依次相连即可,显然不可能有比它更大的直径。这个方案引导我们转化问题:寻找k原创 2021-02-28 17:01:46 · 352 阅读 · 0 评论 -
atcoder E - Greedy Ant(最优解等价+dp)
E - Greedy AntGrice题解最开始看不懂神的思路,还评论请教了一波应该是个集训队大佬QaQsnuke在当前轮直接选取,那么状态会非常不好记录 我们保留snuke在之前轮,选择放弃暂时不选的次数,然后等蚂蚁走到这来了再选虽然这个跟原游戏不同,但显然其不会优于最优解,也包含最优解状态表示:fl,r,kf_{l,r,k}fl,r,k开区间(l,r)(l,r)(l,r)内的糖果已经被取走了,snuke\text{snuke}snuke还能选择kkk次的最优解状态转移:满足k>原创 2021-02-27 22:50:41 · 245 阅读 · 0 评论 -
P2495 [SDOI2011]消耗战(树形dp+虚树)
P2495 [SDOI2011]消耗战树形dp状态表示:fuf_ufu表示以uuu为根的子树中,uuu节点与子树中的关键的“隔开”所需要的最小代价状态转移:考虑uuu的一个儿子vvvvvv是关键点:fu=fu+wu→vf_u=f_u+w_{u\to v}fu=fu+wu→vvvv不是关键的:fu=fu+min(wu→v,fv)f_u=f_u+\min(w_{u\to v},f_v)fu=fu+min(wu→v,fv)于是有下面暴力代码O(nm+∑k)O(nm+\sum k原创 2021-02-21 21:50:58 · 215 阅读 · 0 评论 -
codeforce23 E. Tree(高精度+树形dp)
E. Tree状态表示:fu,jf_{u,j}fu,j表示以uuu节点的子树,uuu所在连通块大小为jjj时,并且没有算上uuu连通块的贡献的最大值状态计算:对于一棵子树vvv来说,显然可以有两种情况uuu节点与vvv节点不连通:fu,j=fu,j×max[fv,1→szv×(1→szv)]f_{u,j}=f_{u,j}×\max[f_{v,1\to sz_{v}}×(1\to sz_v)]fu,j=fu,j×max[fv,1→szv×(1→szv)]uuu节点与vvv节点连通:f原创 2021-02-16 18:03:07 · 190 阅读 · 1 评论 -
P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)
P3565 [POI2014]HOT-Hotels参考题解题目大意:给定一棵树,在树上选 3 个点,要求两两距离相等,求方案数。三个点树上两两距离为d存在下面两种情况某个点三个子树(保证该点是LCA)中分别由三个点距离它为d对于某一个点,它的 d 级祖先以及子树内两个以它为LCA,距它 d 的点对于情况一,设计dp: fu,jf_{u,j}fu,j表示以uuu为根的子树,距i距离为jjj的点数对于情况二,设计dp:gu,jg_{u,j}gu,j表示以uuu为根的子树,两个点的到L原创 2021-02-15 14:29:50 · 299 阅读 · 0 评论 -
codeforces1485 F. Copy or Prefix Sum(dp)
F. Copy or Prefix Sum Venice technique简要就是懒标记思想。由于前缀和数组和原数组一一对应,这里我们选择求aia_iai的前缀和数组的方案数(下面aia_iai表示原题数组的前缀和)不难得知原题目的两个条件即bi=ai−ai−1→ai=bi+ai−1b_i=a_i-a_{i-1} \to a_i=b_i+a_{i-1}bi=ai−ai−1→ai=bi+ai−1bi=ai→ai=bib_i=a_i \to a_i=b_ibi=ai→ai=b原创 2021-02-13 17:35:51 · 2327 阅读 · 1 评论 -
codeforces1485 E. Move and Swap(dp)
E. Move and SwapHel由于红色硬币向下一层走的时候只能走儿子,而蓝色无限制(对后续操作无影响),这里状态表示:fif_ifi表示当前是红色硬币,向下一层走后的最大价值。#define IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)#pragma GCC optimize(2)#include<cstring>#include<iostream>#include<原创 2021-02-13 11:36:05 · 2488 阅读 · 2 评论 -
codeforces1481 E. Sorting Books(贪心+dp)
大佬题解1大佬题解2E. Sorting Books首先每本书都移动,移动次数是n能够满足题意。如果某些书不用移动,说明把隔开他们中间的书全部抽走后自然成组。对于每本书全部移动的情况,显然我们可以选择一种颜色的书全部不案,移动别的书,抽走隔开的书后那么他们就会自然成组。如果存在选择2种书不动的方案,不难知道该两种书出现的区间一定不能相交,因为他们都是自然成组的,如果相交会互相隔断。同理选择3种书不动的方案也一样。预处理每种书出现的区间li,ril_i,r_ili,ri状态表示:fif_if原创 2021-02-11 18:47:07 · 459 阅读 · 1 评论 -
F - Sugoroku2(期望dp)
F - Sugoroku2期望dp:fuf_ufu表示到达终点的期望于是有fu={0,u≥nf0,u∈Afu+1+⋯+fu+mm+1f_u=\begin{cases} 0,u\ge n \\f_0,u\in A\\ \frac{f_{u+1}+\dots+f_{u+m}}{m}+1 \end{cases}fu=⎩⎪⎨⎪⎧0,u≥nf0,u∈Amfu+1+⋯+fu+m+1由于存在返回f0f_0f0的操作,最终出来一定是一个关于f0f_0f0的方程,对于每个点维护f0f_0f0的系数原创 2021-01-24 15:01:29 · 423 阅读 · 7 评论 -
M. Monster Hunter(树形dp)
M. Monster Hunter才知道原来树形dp是三维的,一直没有学会过,感谢大佬的文章!算法进阶—理解树形背包问题状态表示:fi,k,j,{0/1}f_{i,k,j,\{0/1\}}fi,k,j,{0/1}以iii为根的子树,考虑到第kkk个儿子时,使用了jjj次魔法,自己是否被魔法干掉的最小花费。状态转移:fi,k,a+b,0=fi,k−1,a,0+min(fv,cnt,b,0+av,fv,cnt,b,1)f_{i,k,a+b,0}=f_{i,k-1,a,0}+\min(f_{v,cnt原创 2021-01-21 00:01:00 · 444 阅读 · 0 评论 -
E - Escape from the Island(最短路+dp)
E - Escape from the Island大佬题解,码风真的爱了#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)#pragma GCC optimize(2)#include<set>#include<map>#include<cmath>#include<stack>#include<queue>#include<bitset>#in原创 2021-01-15 19:24:09 · 334 阅读 · 0 评论 -
枚举子集dp
二进制枚举子集下面代码就是枚举的s的子集(二进制状态压缩) for(int i=s;i;i=(i-1)&s) { //i表示的就是s的子集 }枚举所有子集的子集的时间复杂度比如一个有n个元素构成的集合,子集的数量是2n2^n2n,现要求枚举所有子集的子集。一个有k个元素构成的集合,子集的数量是2k2^k2k考虑nnn个元素构成的集合子集:元素个数是000的集合个数是Cn0C_n^0Cn0元素个数是111的集合个数是Cn1C_n^1Cn1…\dots…于是有以下等式C原创 2021-01-03 13:29:19 · 1087 阅读 · 0 评论 -
ABC182——F - Valid payments Editorial
F - Valid payments Editorial大佬题解看了述题解我才刚理解题目意思。Here, both Lunlun and the clerk used the minimum number of coins needed to represent those amounts of money.这句话意味着任何数都能用a1…ana_1\dots a_na1…an这些面值的货币唯一表示并且能够推导出:对于第iii种纸币的面值是aia_iai,使用次数一定小于mxi=ai+1原创 2020-11-17 22:33:06 · 331 阅读 · 0 评论 -
codeforces1437 E. Make It Increasing——最长上升子序列
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)#pragma GCC optimize(2)#include<set>#include<map>#include<cmath>#include<stack>#include<queue>#include<random>#include<bitset>#include<string&原创 2020-11-09 23:02:14 · 339 阅读 · 0 评论 -
ARC107——D - Number of Multisets
D - Number of Multisets之前写过一个类似表示的题(2018CCPC吉林赛区——C - Justice),也是让用12,14,18…\frac1 2 ,\frac 14,\frac1 8 \dots21,41,81…凑数,我效仿之前的思路写了个复杂度不清楚的东西(非常爆炸)最终没能过此题记一下自己写的垃圾代码#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)#pragma GCC optimize(2)原创 2020-11-06 18:57:53 · 282 阅读 · 0 评论