好久没做DP今天才发现窝dp水平原来这么渣。。
可能是因为以前抄题解抄多了
找了一堆NOIP范围之内的DP题,不包括各种很吊的DP优化
尽量多思考不抄题解,稍微锻炼一下dp思维好了。。
写一下一句话题解
如果有时间的话尽量写一下做dp题的总结
动规与递推
直接枚举点计算斜率即可,从一个点出发要想能到另一个点,中间不能有斜率比他大的直线,按这个限制直接枚举即可
bzoj 1587
我的第一道前缀和优化$dp$,并不难想
bzoj 2017
神dp,设$f[i][j]$表示还剩$i$个硬币上个人取了$j$个硬币的最大收益,从后往前递推即可(需要复习)
SB记搜,一共四张操作,而最费时间的三种操作总和不超过100。。
bzoj 2815
并不是$dp$。。不过挺好的一道题,拓扑+LCA
bzoj 3791
好骚的$dp$。首先如果说每个点只会被染一次色的话,我们是不是可以很轻松的推出$dp$转移式?事实上,发动$k$次技能,最多把序列分成$k*2-1$段,每段我们要数目较多的那种颜色,这样就可以转移了(需要复习)
难点在排序上,$dp$很好想,设$f[i][j]$前$i$个人表示走了$j$个的最大剩余高度,枚举当前矮人是否逃离即可。排序是按照身高+臂长排序的,这里我说一下我的理解:如果都出不去或都能出去就没必要再讨论了。我们应该选择逃生能力强的放在后边,然后$dp$枚举每个人选还是不选。
不会做,抄的题解,还被卡常。设$f[i][j]$表示放$i$个节点深度小于等于$j$的个数,然后我们会有这么一个想法:已知两棵树,如何拼成一棵新的树?我们可以加一个顶点,让两棵树分别为左右子树,而深度刚好在原先的基础上加1。所以枚举最大深度小于等于$j-1$的两棵树去更新最大深度小于等于$j$的两棵树即可(需要复习)
神$dp$,抄题解还要想半天的那种。。首先我们要排序,这个好理解,因为显然你在那傻不拉几的取小的让别人把大的都拿走了显然是不优的。然后问题可以转化成这样:两个人轮流取数,如果一个数被取走了那么比它更大的数就不能再取了。
然后我们倒着考虑一下,如果A选到$i$停止,那么B从$i+1$处开始选。但是我们要考虑一个问题,因为是倒着考虑的真实的情况下B会比A先选,也就是说B也可以选择取走A的那一份,设当前A能取得最大值是$maxn$,那么B当然可以取到$max(maxn,val[i+1]-maxn)$
最后找到的就是第一个人能取到的最大值(需要复习)
恶心的状压,写起来让人很难受。难在设计状态,以及转移时细节神烦。令$f[i][j][k]$表示前$i-1$个人全部吃完后$B_i$人的状态是$j$,最后一个吃饭的人是$i+k$。
巨大的树形dp的暴力,看上去完全过不了的复杂度也A了。。
看到$k$小于等于50,是不是该考虑把他压进状态。。
树形动规
基环树上dp。环上相邻两点矛盾,所以在环上相邻两个点都做一遍树形dp即可,强制其中一点不能选择
换根法的简单运用
树上管理类问题,贪心即可
换根发的应用,比1131稍微简单一点点
以前只会枚举的$70$分,现在一看竟然秒了,突然感觉学了一年还真有一点点进步的。。其实只要考虑孙子对当前点的贡献和儿子之间的相互贡献就行了,还是蛮套路的事情
状态压缩
bzoj 1688
bzoj 1231
bzoj 3312
bzoj 2073
把每种合法状态(不超重)的时间预处理出来,就可以直接跑一个背包了
luogu 3888
noip2017 宝藏
概率期望(不过应该考不了特别难的题)
换教室
bzoj 1415
bzoj 2818
bzoj 4008
数位DP与计数类DP
应该算思维难度最大的两类dp了吧。。昨天打CF一道数位dp差点没搞出来慌得一批,dp水平弱成狗。数位dp和计数类dp都要稍微练一下
不过好在数位dp有一种不错的dfs的写法可以套用
Dfs一下好像数位dp都是模板。。
bzoj 1833
bzoj 1799
计数类dp这个大佬放的几道题都很棒