
DP
Chester_King
虽千万人,吾往矣。
展开
-
【BZOJ】1096 [ZJOI2007]仓库建设 dp+斜率优化
接上一篇的入门难度,我们再来看看普通难度的斜率优化。依然是题目传送门。其实有关于斜率优化的所有题目的解题思路都是差不多的,换汤不换药罢了。由题意,我们可得一个朴素的dp方程:原创 2017-02-17 09:33:12 · 403 阅读 · 0 评论 -
【洛谷】2831 [Noip2016]愤怒的小鸟 状压DP
题目传送门突然感觉NOIP好难啊,要是这题放在考试中我肯定又是不会做的……观察数据范围,n≤18n \leq 18,我们想到了什么?没错,就是状压DP。首先我们已经知道了抛物线的形式y=ax2+bxy=ax^2+bx,那么我们可以O(n2)O(n^2)枚举点对算出抛物线的各项的系数,然后在判断一下哪些点在这条抛物线上。之后枚举状压的状态,选择从小到大的第一个不在状态里的点,然后枚举抛物线,直接进行状原创 2017-10-20 20:43:45 · 303 阅读 · 0 评论 -
【51nod】1779 逆序对统计 状压DP
题目传送门这题好迷啊,一直都看不懂题目意思……(就不能TMD说的清楚点吗?)题目大意:有nn个位置和mm道题目,第ii道题目的权值为ii,可以放在第a[i]a[i]位上,求最大逆序对数。看到数据范围里n≤20n \leq 20,瞬间想到了状压,果真如此。定义f[j]f[j]表示当前状态为j的最大逆序对。我们顺序读入mm道题目,显然权值单调递增,即每道题目能和所有在它之前、放在它之后的题目形成逆序对。原创 2017-10-15 21:33:19 · 416 阅读 · 0 评论 -
【51nod】1052 最大M子段和 DP
题目传送门好吧,好像是我ZZ了,原来连续的一段数可以当做许多段数来看的……(突然掀桌,气得我都变成简笔画了!害得我WA了6发!)其实这题就是一道非常水的DP题,定义f[i][j][0/1]f[i][j][0/1]表示前ii个数选了jj段,第三维表示当前的数是否被选在第jj段数内。然后直接进行状态转移就行了。突然发现这样开数组会MLEMLE,又发现好像第ii个数的状态只和第i−1i-1个数的状态有关,原创 2017-10-17 16:05:55 · 292 阅读 · 0 评论 -
【BZOJ】1087 [SCOI2005]互不侵犯King 状压DP(轮廓线DP)
题目传送门看到这么小的数据范围,立马就想到了状压DP。p.s.如果看到数据范围小于20,首先考虑状压DP;小于50,首先考虑折半搜索。——佳龙大佬考虑每一行的国王放置,只和上一行的国王放置情况有关,于是我们可以枚举这两行的国王放置情况。然后我们考虑DP状态的设置,定义f[i][j][now]表示当前放到第i行,已经放了j个国王,当前行的国王放置情况为now的方案数。状态转移方程原创 2017-08-17 20:45:31 · 314 阅读 · 0 评论 -
【计蒜客】「2017 计蒜之道 复赛」A.阿里云秘钥池 数位DP+莫比乌斯函数
内个……我还没有计蒜客的账号,就先不给题目传送门了……看到数据范围不正常,就想到了数位DP。定义f[i][j]f[i][j]表示从高到底DP到第ii位,第i+1i+1位上的数为jj的方案数。 f[i][j]=∑k=1p−1f[i−1][k]×[(j,k)=1]=∑k=1p−1f[i−1][k]×∑d|(j,k)μ(d)=∑d|jμ(d)∑t=1⌊p−1d⌋f[i−1][d×t]f[i][j]=\原创 2017-12-10 16:06:37 · 330 阅读 · 0 评论 -
【BZOJ】2286 [Sdoi2011]消耗战 树形DP+虚树
题目传送门第一眼就是树形DP,然而看到数据范围以后望而却步……O(n×m)O(n\times m)的时间复杂度实在受不了啊……观察数据范围,发现题目给出的是∑ki≤5×105\sum k_i \le 5\times10^5,那我们就要考虑减少每次询问的时间复杂度,不能是O(n)O(n)的,应该和kik_i有关吧。于是我们就想:有没有什么高级的数据结构,可以让我们的时间复杂度降下来,把多余的状态舍去呢原创 2017-12-24 11:39:39 · 280 阅读 · 0 评论 -
【BZOJ】3991 [SDOI2015]寻宝游戏 树形DP+虚树+set
题目传送门其实这题并没有真正的用到虚树,只是用到了虚树的思想。首先考虑暴力树形DP,时间复杂度还是O(n×m)O(n\times m),必须要优化。然后我们把思路转移到虚树上,发现问题转化为改变一个节点是否为关键点,答案就是虚树上所有边权*2。我们考虑一个节点加入虚树产生的贡献,就是DFS序中和当前节点相邻的节点的路径长度*2,删除同理。那么我们每次维护改变的节点的贡献即可。可以用一个set来维护当原创 2017-12-24 19:17:59 · 344 阅读 · 0 评论 -
【BZOJ】4300 绝世好题 DP
题目传送门忍不住吐槽一下这个题目,绝世好题……出题人有毒的吧……看到数据范围,想O(nlogn)O(n\log n)的搞,但是没有任何思路……定义f[i]f[i]表示处理到当前的数,第ii位不为00的最大长度。状态转移方程也挺好想的,首先ans=max(f[i]),i∈[0,30]ans=max(f[i]),i\in[0,30],然后用ansans来更新所有的f[i]f[i]即可。附上AC代码:#i原创 2017-12-05 20:10:18 · 222 阅读 · 0 评论 -
【洛谷】2034 选择数字 DP+单调队列
题目传送门有位大佬叫JZ,他在一次讲课里提到了“正难则反”的原则,虽然他讲的是数位DP,但是这个原则用在这题上也是有非常显著的效果的。题目要求不能有超过kk个连续的数字被选择,求最大权值。那么我们考虑在每kk个数中都要去掉一个数,求去掉的数的最小值。这样的话状态转移方程非常好写:定义f[i]f[i]表示前ii个数去掉一些数的最小值,f[i]=f[j]+a[i],j∈[i−k,i−1]f[i]=f[j原创 2017-10-29 21:12:05 · 454 阅读 · 0 评论 -
【51nod】1406 与查询 DP
题目传送门考虑一个数num&x==xnum\&x==x,说明xx在二进制下为1的位置上numnum也为1。定义f[x]f[x]为ai&x==xa_i\&x==x的aia_i的个数。如果y&x==xy\&x==x,即yy是xx的一个子集,那么f[y]f[y]一定对f[x]f[x]产生贡献。这样就可以枚举子集转移了,但是可能会有重复计算,于是从高位向低位转移。p.s.输入输出数据量原创 2018-01-12 20:54:45 · 261 阅读 · 0 评论 -
【51nod】1407 与与与与 DP+容斥
题目传送门好难懂的一道题啊……%%%sillyf先把题目转化一下,答案就等于所有组合-and值不为零的组合。定义f[x]f[x]为ai&x==xa_i\&x==x的aia_i的个数,g[x]g[x]为xx转化为二进制后1的个数。f[x]f[x]的求解方法见上一篇blog。容斥一下求and不为零的组合情况: ans=∑x=11000000(−1)g[x]−1×(2f[x]−1)a原创 2018-01-12 20:55:17 · 431 阅读 · 0 评论 -
【51nod】1486 大大走格子 DP+组合数学
题目传送门很久以前就考过的题目了……但是为什么我一直都不会……考虑两个障碍物之间的转移,方案数就是Cx2−x1x2−x1+y2−y1C^{x2-x1}_{x2-x1+y2-y1}。把起点和终点加到障碍物里一起转移,先按坐标升序排序。然后定义f[i]f[i]表示前ii个障碍物只经过第ii个的方案数,f[i]=Cxi−1xi+yi−2+∑jij=1f[j]×Cxi−xjxi−xj+yi原创 2018-01-12 21:14:22 · 277 阅读 · 0 评论 -
【BZOJ】1875 [SDOI2009]HH去散步 DP+矩阵优化
题目传送门这题好像在暑假集训的时候讲过诶……当时并没有认真听课的我表示只能自己再去学一发了……题目大意:给出点数n、边数m、步数t、起点st和终点ed,还有m条双向边,限制条件是不能从刚走过来的边马上走回去,求从st走t步到ed的方案数。我们考虑矩阵的乘法,核心代码如下:for (int i=0; i<=n; ++i) for (int j=0; j<=n; ++j) for原创 2017-10-11 21:32:12 · 256 阅读 · 0 评论 -
【BZOJ】1009 [HNOI2008]GT考试 KMP+DP+矩阵优化
题目传送门又是一道神题,感觉这题的思想好强啊。首先考虑DP,定义f[i][j]表示当前我们DP到准考证的第i位,后缀与不吉利的数字匹配了j位的方案数。状态转移方程为f[i][j]+=f[i-1][k],可以通过枚举第i位的数字,求出k的大小,进行状态的转移。突然发现求k的过程和KMP的失配过程差不多,于是我们可以用KMP来转移状态。但是这个DP显然是不符合我们的要求的,时间复杂度巨大。考虑重构DP,定义f[i][j]表示当前我们DP到不吉利数字的前i位(注意,这里和上面不一样),在第i位后放置一原创 2017-10-09 17:53:35 · 233 阅读 · 0 评论 -
【HDU】4507 吉哥系列故事——恨7不成妻 数位DP
题目传送门挺有意思的一道数位DP题。(本来想用普通的数位DP方法水过,然后就被数据艹了)这题的解题思路是数位DP,但是需要进行一些加工。定义f[i][j][k]表示当前已经(从高到低)处理了i位,数位和%7为j,数字%7为k的状态。状态中记三个值,一个是以当前的数为前缀的合法数字个数c,一个是所有合法数字的数位和sum,一个是所有合法数字的平方和sqr。考虑状态转移,设答案为a原创 2017-10-08 21:19:22 · 398 阅读 · 0 评论 -
【BZOJ】1026 [SCOI2009]windy数 数位dp
题目传送门感觉自己真的是越来越菜了,连数位dp都写不来了……定义f[i][j]表示当前取到第i位(从高位到低位),当前位置为j的方案数。然后就是对于是否存在前导0的分类讨论,并同时统计答案。最后利用差分的思想,把[l,r]的windy数的数量转化成[1,r]的windy数的数量减去[1,l-1]的windy数的数量即可。附上AC代码:#include #include原创 2017-05-31 19:22:42 · 232 阅读 · 0 评论 -
【HDU】2196 Computer 树形dp
题目传送门博主暴走中……神他妈的HDU,不能用fread读入的!!!我因为这个错WA了10+发……这题的题意就是求每一个节点在树上和它距离最大的点的距离。其实这题的思路还是挺清晰的,我们可以对于一棵有根树的一个非根非叶子节点进行讨论。这个节点的最大距离有两种情况,一种是从以该节点为根的子树的最大距离扩展过来,另一种就是从父亲节点扩展过来。引用一下另一位大佬的图片(看2号节点):原创 2017-06-15 20:22:05 · 227 阅读 · 0 评论 -
【POJ】3107 Godfather 树形dp
题目传送门一大早只能先用水题来唤醒自己的思维,毕竟为了期末考准备了半个月,有点失了智。个人认为,对于英文题目,看懂题目最重要……这题的大意是在一棵无根树中,求最大子树最小的节点序号。其实这题的解题思路非常直白,就是求树的重心,如有多个,需排序。然后,就没有然后了啊……附上AC代码:#include #include #define N 50010using nam原创 2017-06-29 09:14:59 · 292 阅读 · 0 评论 -
【POJ】3140 Contestants Division 树形dp
题目传送门这题给我最深的感受就是:初始化很重要……我因为初始化的原因WA了一中午……这题其实和dp并没有什么特别大的联系,其实是一个枚举。对于截断的一条边的两个节点所在子树大小差取一个最小值就行了。可以把这题中的树想象成一棵有根树,令第一号节点为根,然后枚举当前节点的所有子树,即枚举所有的边,然后计算答案就行了。附上AC代码:#include #include #def原创 2017-06-29 20:18:05 · 287 阅读 · 0 评论 -
【BZOJ】3036 绿豆蛙的归宿 期望DP
题目传送门补一发期望DP,这道题困扰了我很久了,今天终于A掉了,比较开心:)f[i]=∑j∈son[i]f[j]+dis(i,j)deg[i]上面就是整道题的核心,只要从第一个节点开始DFS就行了。附上AC代码:#include #include #define N 100010using namespace std;struct side{ int to,w,原创 2017-06-02 21:09:35 · 270 阅读 · 0 评论 -
【POJ】2342 Anniversary party 树形dp
题目传送门曾经身为蒟蒻的我对树形dp一无所知,现在依然身为蒟蒻的我认为树形dp不是不能做。要相信蒟蒻也是有明天的。Flag:树形dp入门题,从此我入了树形dp的坑。设f[i][0~1]为第i个人是否出席的最大快乐指数。(0表示没出席,1则反之)状态转移方程也非常好写:设j为i的下属,1.若第i个人出席,则f[i][1]+=f[j][0]2.若第i个人不出席,则f原创 2017-06-13 19:59:15 · 218 阅读 · 0 评论 -
【HDU】3586 Information Disturbing 二分+树形dp
题目传送门我又一次感受到了初始化的重要性:我又错在了初始化上了……(多组数据死全家!!!)这题的思想还是挺好的,二分答案加上树形dp,分开来看都挺简单的,但合起来就需要一点脑洞了。我们可以二分一个答案出来,作为题目要求的最大边权值,然后用树形dp来判断这个答案是否成立。综上,这题就被完美的解决啦。附上AC代码:#include #include #include #d原创 2017-06-30 14:11:29 · 319 阅读 · 0 评论 -
【BZOJ】1003 [ZJOI2006]物流运输 最短路径+DP
题目传送门复习一下之前所学,回忆一下一年前还身为普及组的菜鸡,被省选题干趴下的故事。去他妈的张又又!这道题的解题思路是非常神奇的,需要一定的脑洞。定义g[i][j]表示从第i天到第j天都不换路线的最小代价,显然我们可以用最短路径算法处理出g数组。然后就是DP了。定义f[i]表示从第1天到第i天的最小代价,显然这可以用O(n^2)的DP来做,状态转移方程也非常好想,f[i]=min(f[原创 2017-07-03 08:49:38 · 397 阅读 · 0 评论 -
【BZOJ】3687 简单题 DP+bitset
题目传送门前几天的考试考到了bitset,于是我就去学了一发。大佬传送门,这位大佬已经讲的很清楚了,我就不再赘述bitset的功能和用法了。其实说白了,bitset就是一个可以位运算的bool数组罢了。回到这题,我们可以很容易想到的是DP,定义f[i[表示当前子集的算术和为i的子集构成方案数。状态转移方程也非常好想,f[j]+=f[j-a[i]]然后就是统计答案,若f[i]原创 2017-07-06 22:38:11 · 330 阅读 · 2 评论 -
【BZOJ】1040 [ZJOI2008]骑士 树形DP
题目传送门好难啊,我太菜了,连题解都看不懂啊……orz教主JN,把一道如此难题讲得如此精简,JN是最强的!(这是JN邪教的信条!)翻开题解,都是一群大佬在刷什么基环外向树,吓得我抱起了抱着抱着抱着我的我的我的我。(这TMD什么玩意儿?!)这道题给出的是一张n个节点、n条边的有向图。但只要稍微脑补一下,其实是无向图。题目并没有说整张图是联通的,所以这是一片基环外向树森林。对于普通原创 2017-07-11 10:42:21 · 293 阅读 · 0 评论 -
【BZOJ】1010 [HNOI2008] 玩具装箱toy dp+斜率优化
题目我就不再赘述了,题目传送门首先我们先来了解一下斜率优化的用处:斜率优化就是把一些特殊的dp方程化简、变形,然后用维护单调队列,把O(n^2)的时间复杂度降至O(n),实现程序的提速。 最基本的dp方程可以很容易的想到:f[i]=min{f[j]+(i-(j+1)+s[i]-s[j]-L)^2} (0其中s[i]表示从玩具1到玩具i的长度和。原创 2017-02-16 18:08:06 · 388 阅读 · 1 评论 -
【洛谷】2344 奶牛抗议 DP+树状数组
题目传送门这是一道普及组的题目……不要拦着我,我要跳楼……首先我们可以轻松写出状态转移方程:f[i]=Σf[j] (j这个DP的时间复杂度是O(n^2)的,显然过不了这题。然后我们就考虑有没有一种数据结构可以统计一个限度内的前缀和,显然树状数组满足了我们的要求。于是这题就A掉啦……p.s.这题的权值可能较大,记得在对权值离散化一下。再次p.s.记得考虑1~i这些元素分成原创 2017-09-20 21:36:00 · 279 阅读 · 0 评论 -
【BZOJ】4720 [Noip2016]换教室 期望DP
题目传送门这题考的是期望DP,虽然在考的时候我并不会期望DP,但这仍然不能阻挡我骗分的脚步。至少用floyd和枚举第一段时间是否换课还是可以骗到52分的。首先是用floyd跑出每两个点之间的最短路,然后就是DP。我们定义f[i][j][k]表示在第i段时间,申请换课j次,当前是否换课的最小期望。然后就是对于第i段时间和第i-1段时间是否换课的分类讨论:1.若第i段时原创 2017-05-22 18:43:17 · 278 阅读 · 0 评论 -
【BZOJ】3925 [Zjoi2015]地震后的幻想乡 状压+期望DP||定积分
题目传送门这题是真的神仙题……整整花了我两个礼拜来理解这题首先这题据我了解有三种做法:纯OI做法、积分+数学推导、直接积分请做好一定的心理准备,接下来的东西可能有点难理解~~(好像不是一点点的难吧……)~~1.纯OI做法首先我们根据期望的线性性,可以得到ans=∑x=0mw(x)×p(x)ans=\sum_{x=0}^mw(x)\times p(x)ans=∑x=0mw(x)×p(x...原创 2018-10-08 20:55:59 · 552 阅读 · 0 评论