
DP、递推
文章平均质量分 68
neither_nor
这个作者很懒,什么都没留下…
展开
-
BZOJ4720 [Noip2016]换教室
f[i][j][k]表示前i门课,申请了j次,第i门申请或者不申请转移即可#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MA原创 2016-11-22 14:24:06 · 897 阅读 · 0 评论 -
BZOJ3612 [Heoi2014]平衡
想了好长时间的题,然后发现ahcisy A了,最后还是看了题解首先我们需要掌握一些基础物理知识……虽然大家可能没上过高中课但是初中课还是上过一点的把……我们需要计算1~n里选j个数,和为i的方案数而事实上就是把i拆分成1~n里互不相同的j个数的方案数几位f[i][j]考虑最小值是否为1,若为1,f[i-j][j-1],若不为1,f[i-j][j]再减去最大值大于n的方案,即原创 2017-02-22 19:29:00 · 706 阅读 · 0 评论 -
BZOJ1426 收集邮票
上来看错题,看题解才发现……题意不是说买第k种要k元,而是第k张要k元……然后嘛,f[i]代表已经有i种,期望还有买几次,g[i]代表已经有i种,期望还要花多少钱然后f[i]=f[i+1]+(n-i)/n比较显然然后g[i]的话可以认为这次花了1块钱,然后之后每次都多花一块钱,所以代价为1+f[选一次之后有多少种],然后分选到有的还是没有的讨论,最后整理一下即可整理之后的式原创 2017-03-02 16:57:54 · 508 阅读 · 0 评论 -
BZOJ4006 [JLOI2015]管道连接
f[i]表示令i这个颜色集合里的所有颜色都满足同颜色联通的最小代价则f[i]=min(g[i],f[i^j]+f[j])g[i]为对这些点做斯坦纳树,j为i的子集#include#include#include#include#include#include#include#include#include#include#include#include#includ原创 2017-03-17 16:52:13 · 848 阅读 · 0 评论 -
BZOJ4774 修路
同BZOJ4006#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAXN 10010#define MAXM 10010#def原创 2017-03-17 16:53:08 · 1160 阅读 · 0 评论 -
BZOJ4773 负环
易知负环长度不超过n考虑朴素做法,f[i][j][k]代表从i到j,最多k条边,最小长度那么没转移一次看有没有负环即可复杂度n^2m但是并不知道题面里那个m的范围什么鬼我们可以考虑倍增优化这个东西就是倍增floyd那种从大到小枚举2的幂,如果做2^i次转移后还没有负环就做2^i次转移,否则不做类似倍增LCA复杂度n^3logn但是由于m玄学的范围跑的比暴力慢原创 2017-03-17 16:56:44 · 1453 阅读 · 0 评论 -
BZOJ3812 主旋律
对题面就不作评价了……然后嘛,我们考虑用总的子图个数减去不强联通的个数对于不强联通的个数,我们考虑枚举缩点后出度为0的点的点集,然后容斥,若缩完有奇数个点就减去,有偶数个点就加上再用一些奇技淫巧因为不咋想写所以还是推荐跳到大爷那里看注释把-_-#include#include#include#include#include#include#include#incl原创 2017-03-09 09:53:21 · 1009 阅读 · 0 评论 -
BZOJ2067 [Poi2004]SZN
第一问可以dp,第二问可以二分答案,然后再dp一遍判断dp的时候记录最少用多少路径以及连着父亲的路径多长即可把所有儿子按长度排序后尽量合并复杂度n log^2 n#include#include#include#include#include#include#include#include#include#include#include#include#in原创 2017-03-21 16:40:26 · 986 阅读 · 0 评论 -
BZOJ4784 [Zjoi2017]仙人掌
不妨把所有环上的边删掉,剩下一个森林,不同联通块之间一定不能连边,否则就不是仙人掌了,那么把每棵树的方案数乘起来即是答案题面中说没有重边,那么不妨把不在环上的边都看成重边,这样问题转化为给定一棵树,求用边不相交的链覆盖所有边的方案数那么考虑与一个点相连的所有边,这些边之间可以相互配对,那么事实上答案就是对于所有点,把f[d[i]]作乘积,d是把环删掉之后的度数,f[i]代表i个点,可以两两原创 2017-03-28 20:44:29 · 866 阅读 · 0 评论 -
BZOJ4753 [Jsoi2016]最佳团体
一眼01分数规划……然后问题转成树上找一个包含根的联通块权值最大树上背包即可复杂度n^2 log n妈的这么道傻逼题调这么半天……#include#include#include#include#include#include#include#include#include#include#include#include#include#include原创 2017-02-20 19:09:56 · 1513 阅读 · 0 评论 -
BZOJ3329 Xorequ
x^3x=2x即x^2x=3x即x^2x=x+2x即x与2x的为1的位没有交即x没有相邻的为1的位那么第一位二进制数位DP,第二问矩乘即可#include#include#include#include#include#include#include#include#include#include#include#include#include#i原创 2017-01-17 15:37:59 · 764 阅读 · 0 评论 -
BZOJ2331 [SCOI2011]地板
这鬼题……考虑一下插头DP,3种插头,分别表示拐弯了,没拐弯和没插头,逐个转移轮廓线DP一下即可,复杂度3^min(n,m)*nm不知道为什么他们跑的都那么快,我卡了半天常数还是这么慢。#include#include#include#include#include#include#include#include#include#include#include#inc原创 2017-01-15 14:37:24 · 1207 阅读 · 0 评论 -
BZOJ4726 [POI2017]Sabota?
打完一场cf,等分顺便日一道POI2017首先显然最劣情况初始的叛徒肯定是叶子并且带头叛变的人一定是从某个叶子往上走一条链因为如果i没有带头叛变,那么i的父亲也一定不会带头叛变,证明显然f[i]表示i不带头叛变的话最小的x那么我们对所有子树大小>k的f值取max即是答案f[i]=max j为i的儿子 (min(f[j],siz[j]/(siz[i]-1))因为对于i的一原创 2016-11-28 03:09:35 · 970 阅读 · 0 评论 -
BZOJ4346 [POI2016]Nadajniki
我们考虑树形dp,对每个子树求出覆盖这个子树需要的最小代价首先发现一个点上放多于2个路由器没卵子意义那么我们考虑一下状态,我们需要用f[i][j][k][l]表示以i为根的子树,i这个点放了j个路由器,i的儿子里有j个路由器(如果大于2个则视为2个),i的父亲至少需要有l个路由器的最小代价,然后挨个子树大力转移即可,不过这样的话复杂度是n*(3^6)的,爆炸了……然后我们就需要压缩一下原创 2016-12-19 15:20:48 · 544 阅读 · 0 评论 -
BZOJ4033 [HAOI2015]树上染色
考虑dpf[i][j]表示以i为根的子树里有j个黑点,他们对答案的最大贡献是多少这个贡献不仅考虑子树内同色的点两两之间的距离,也考虑子树内的点与子树外的点之间的距离和在子树内的部分然后我们枚举x的每个儿子y,再在1~当前的siz[x]和1~当前的siz[y]中枚举分别放多少个黑点,更新dp值,然后讲siz[x]加上siz[y]复杂度n^2,因为相当于枚举了每个点对这个复杂度分析原创 2016-12-29 14:51:22 · 929 阅读 · 1 评论 -
BZOJ2111 [ZJOI2010]Perm 排列计数
我们把整个序列看成一棵树,x的左儿子是2x,右儿子是2x+1这样问题就变成了给这棵树标号,儿子的标号必须比父亲大dp即可f[i]表示以i为根的子树,在标号集合已经确定的情况下的标号方案数如果i是叶子,f[i]=1如果i只有1个儿子,f[i]=f[2i]如果i有两个儿子,f[i]=f[2i]*f[2i+1]*C(siz[2i]+siz[2i+1],siz[2i])siz为原创 2016-12-29 18:36:44 · 644 阅读 · 0 评论 -
BZOJ4416 [Shoi2013]阶乘字符串
鬼畜题啊……上来看错题,看成子串,n>=6直接无解,n然后就跪了,只好上网找题解,然后看到了一个非常厉害的结论:当n>21的时候无解!好像证明是当n>21的时候C(450,n)然后我们可以f[i]表示要使得状态为i的字符的全排列都出现最少需要前多少个字符然后与处理一下每个位置之后每个字符第一次出现在哪然后对于一个状态i,我们枚举所有这个状态包含的字符x,假设x是最后一个,那原创 2016-12-29 21:00:23 · 331 阅读 · 0 评论 -
BZOJ4521 [Cqoi2016]手机号码
一眼数位DP……去年上半年想刚这题,结果刚了一上午没刚出来,GG了……今天又来刚,结果半个上午就刚出来了考虑题目里的一些限制条件,和数位DP的过程,不难想出状态:f[i][j][k][l][u][o]表示i位,最高位是j,最高位在前面已经连续出现了仅1次或多于1次,是否有连续3个一样的,是否出现过4,是否出现过8套用数位DP的过程,在从高位到低位逐位确定的时候记录在前面是否已经出现原创 2017-01-08 09:37:00 · 500 阅读 · 0 评论 -
BZOJ1833 [ZJOI2010]count 数字计数
数位DP模板题然而我并不会-_-orz了一发hzwer学长的代码,终于学会了数位DP设f[i][j]表示i位,开头为j的方案数(算前导零)先预处理f数组求a以内的答案时,先加上所有位数不足a的位数的,然后从高位到低位枚举当前位是几,计入答案,然后定下这一位,枚举下一位基本把黄学长的代码抄了一遍-_-复杂度O(位数*10*更新复杂度)#include#include#原创 2016-05-18 08:01:57 · 981 阅读 · 0 评论 -
BZOJ4676 Xor-Mul棋盘/BZOJ3254 Xor-Mul Chessboard
首先位运算具有独立性,那么我们可以每一位分别考虑,那么我们只需要确定这一位是0还是1考虑f[i][j]表示第i行,状态为j的最小花费复杂度20nm4^n预处理两个状态之间的转移,复杂度20m4^n我写了一发,但是还是T了我们可以考虑逐格转移,f[d]表示当前轮廓线状态是d的最小花费,然后逐格转移,每次把轮廓线移动一格,枚举状态,对新格子上面原来是0还是1两种状态计算新格子的影响原创 2017-01-08 20:52:09 · 425 阅读 · 0 评论 -
BZOJ3810 [Coci2015]Stanovi
看了题还以为是什么牛逼的构造,然后搜了发题解结果是记忆化搜索……f[n][m][u][d][l][r]表示n行m列,上下左右分别是否面向大海,春暖花开考虑分割成两个矩形,对于任意一种分割方案都一定存在一条贯穿横向或者纵向的线,那么枚举这条线即可状态可以优化一下减少一些,强制令行数大于列数,当上下或者左右边界里只有一个面朝大海春暖花开时强制令上左的是面朝大海春暖花开的#inclu原创 2017-03-22 07:29:42 · 853 阅读 · 0 评论 -
BZOJ4762 最小集合
先考虑把所有数取反,问题变成求使得所有数的或和为全集,且任意一个缺一个数的子集的或和都不为全集的方案数考虑dp,f[i][j][k]表示在前i个数中选了一些,这些数或和为j,要求k是后n-i个数里选出来的数的或和的子集的方案数不要问我为什么会有这种鬼畜状态-_-那么考虑转移,设第i+1个数为x,假设第i+1个数不选,那么f[i+1][j][k]+=f[i][j][k]如果第i个数选原创 2017-03-24 08:36:27 · 644 阅读 · 3 评论 -
BZOJ1835 [ZJOI2010]base 基站选址
搜了一下,被告知是线段树优化dp那么就瞎YY一下考虑f[i][j]表示第村庄i建一个基站,1~i一共建了j个基站,前i个村庄的总代价最小是多少那么我们可以考虑枚举倒数第二个基站进行转移考虑补偿带来的代价,因为只考虑前i个村庄,所以也只考虑前i个村庄补偿带来的代价每个村庄会对应一段区间,只要这个区间里有基站那么就不用补偿那么考虑每如果i大于某一个村庄j的区间的右端点,那么在计原创 2017-03-21 18:15:55 · 733 阅读 · 0 评论 -
BZOJ1334 [Baltic2008]Elect
傻逼题,按大小排序,然后直接背包即可,转移的时候保证不从>s/2的地方转移就行#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAXN原创 2017-05-25 11:35:05 · 552 阅读 · 0 评论 -
BZOJ4884 [Lydsy2017年5月月赛]太空猫
这个傻逼题……比赛的时候读出了三种题意,然后各写了一遍结果全wa了,后来才被告知有坑点……题意:操作有三种,可以向左或向右移动一格,或者重力反转,操作只能在落地之后再进行,问到终点的最小代价容易看出向左走蛋用没有f[i][0/1]表示走到第i列,重力向下/上的最小代价,随便转移即可坑点就是前一列的下边界比后一列的上边界高或者前一列的上边界比后一列的下边界低#include#i原创 2017-05-15 21:05:52 · 606 阅读 · 2 评论 -
BZOJ4849 [Neerc2016]Mole Tunnels
考虑如果给定一个K算答案怎么算,我们可以费用流,每个树边建流量INF费用1,每个点向T连流量c[x]费用0,对于前k个鼹鼠,S向每个鼹鼠出现的位置连一个流量1费用0的边,然后跑最小费用最大流即可求出最小代价那么如果是对于每个K都要求的话,我们可以考虑令S连向第i个鼹鼠出现位置的边费用为(m-i+1)*INF,这样的话第i次曾广一定会走第i个鼹鼠出现的位置,那么増广i次之后得到的就是前i个鼹鼠的原创 2017-05-18 19:05:52 · 722 阅读 · 0 评论 -
BZOJ4835 [Lydsy2017年4月月赛]遗忘之树
f[x]表示分治树以x为根的子树的情况数f[x]就等于对于每个分治儿子y,f[y]*siz[y]的乘积但是注意到如果有两个重心他要求最小那个所以如果有一个分治子树大小恰好等于本身子树大小/2,那么对于这个子树乘的就是f[y]*siz(y,x),siz(y,x)代表y的分治子树内标号比x大的点的个数因为分支结构的树高是log的,所以sigma 子树大小也是log的(因为sigma 子原创 2017-04-27 20:31:02 · 862 阅读 · 0 评论 -
BZOJ3864 Hero meet devil
上午考试的时候AK了,看代码还挺短的,于是学习了一下DP套DP,感觉挺傻逼的考虑求LCS那个DP,我们发现对于固定的i和任意的j,f[i][j]最多只能和f[i-1][j]有关,不可能和f[i-2][j]或者更往前的DP值有关并且f[i][j]要么和f[i][j-1]相等,要么等于f[i][j-1]+1那么我们可以状压这个是否比前一个大1,然后g[i][j]表示长度为i,跑LCS的DP原创 2017-06-01 20:50:22 · 1087 阅读 · 0 评论 -
BZOJ4922 Karp-de-Chant Number
这题真是tmd……让我想起了做bohater时候的绝望还好最后A了注意到每个括号序列相当于必须在当前前缀和>=x的情况下才能选,选完之后前缀和会+y那么就是bohater原题了,按那道题的顺序排序一下,然后DP即可,f[i][j]表示只用前i个串前缀和为0的最长长度答案为f[n][0]#include#include#include#include#include#i原创 2017-06-20 12:12:14 · 836 阅读 · 0 评论 -
BZOJ3425 Poi2013 Polarization
首先我们要证明这道题的一个性质:最优解一定具有如下形式:以树的某一个重心(可以是任意一个)为根,根的每一个子树里的所有边要么都指向根,要么都指向叶子引理:首先对于一棵树,我们把所有边的朝向反转,那么好的点对数不变,显然那么我们要证明树中一定存在一个点,我们称之为“犇点”,其满足以他为根,他的每一个子树里的所有边要么都指向根,要么都指向叶子假设不存在一个犇点,那么树中一定存在点对(x,y原创 2016-10-02 23:54:44 · 1222 阅读 · 0 评论 -
BZOJ4899 记忆的轮廓
我们知道只要误入歧途你就再也不能回到正轨了,只能走到错误叶子然后读档那么我们先求出g[i]代表在i误入歧途之后期望要走多远才会读档然后求出dis[i][j]代表在i存档之后从i走到j中间不存档期望要走多少步这个n^2随便求那么我们可以DP,f[i][j]表示从起点走到i,并在i存档,当前一共已经存档j次的最优期望步数直接转移显然是n^2p的我们发现题目限制了每个点的度数>=原创 2017-05-25 11:29:58 · 896 阅读 · 0 评论 -
BZOJ4872 [Shoi2017]分手是祝愿
YY一下给定一个局面怎么求最少步数,就是可以转换成一个异或方程组,然后令所有变量的和最小我们可以发现把这个异或方程组用矩阵表示出来之后,他的对角线是1,而下三角里全是0……也就是说不需要消元,并且有唯一解那么我们还知道这个矩阵的结构比较特殊(只有在i的约数行第i列才为1),那么我们可以直接预处理每个数的所有约数然后爆解,由调和级数知解出来的复杂度是n log n的那么考虑一下加入了原创 2017-04-24 15:15:18 · 1491 阅读 · 0 评论 -
BZOJ4870: [Shoi2017]组合数问题
人话题意:从nk个物品里选模k余r个物品,问方案数模P大傻逼题,绝对傻逼题,但是考场上没几个人想出来……太傻逼了f[i][j]表示前i个物品选模p余j个,然后矩乘即可#include#include#include#include#include#include#include#include#include#include#include#include#原创 2017-04-24 14:50:18 · 1925 阅读 · 0 评论 -
BZOJ1966 [Ahoi2005]VIRUS 病毒检测
看了一眼正则表达式那套理论,然后并不想学看了一眼网上题解,说n^3能A那就暴力吧f[i][j]表示前i个字符能不能匹配前j个字符搞搞即可数据较水,网上有的标程就是错的,我的另一份确定错误的代码也能A,现在我也不能保证我的对不对,不过总之贴上来把#include#include#include#include#include#include#include#in原创 2017-03-29 17:12:00 · 692 阅读 · 0 评论 -
BZOJ2298 [HAOI2011]problem a
挺厉害的题答案就是n-最多有多少人同时说真话考虑第i个人说的话,那么他的意思就是他的排名在a[i]+1到n-b[i]之间,且这个区间里的人分数都相等那么我们考虑dp,f[i]表示i和i+1的分数不一样,考虑所有排名小于等于i的人最多有多少人说真话,那么我们枚举分数上一次改变在哪,进行转移即可也就是枚举所有右端点是i的区间,用f[j-1]+min(区间长度,这个区间的数量)更新f[i原创 2017-03-14 19:18:50 · 380 阅读 · 0 评论 -
BZOJ4048/3928 [Cerc2014] Outer space invaders
容易发现对于距离你最远的那个外星人,你一定是要在某个时间打他一发的,并且这一发可以顺便带走出现时间区间包含了你打这个时间的其他外星人那么我们离散化一下,然后考虑区间DPf[i][j]表示把出现时间>i,消失时间为什么不是出现时间>=i,消失时间那么找到这些外星人里距离最远的,然后枚举在哪个时间打这个外星人,f[i][j]=min(f[i][k]+f[k][j]+d[x]),d[x]原创 2017-04-02 14:49:58 · 1058 阅读 · 1 评论 -
BZOJ4818 [Sdoi2017]序列计数
看数据范围一眼矩乘f[i][j]表示前i个数,和模p余j用任意取的方案减去不取质数的方案即得到至少有一个质数的方案对任取和不取质数分别随便做个转移矩阵快速幂即可#include#include#include#include#include#include#include#include#include#include#include#include#inc原创 2017-04-11 17:17:00 · 574 阅读 · 2 评论 -
BZOJ3566 [SHOI2014]概率充电器
显然treeDP那么我们令f[i]表示以i为根的子树,不与根联通的连通块的期望亮的个数,再记一个根所在的连通块期望亮的个数,那么加起来就是以i为根的子树的答案根所在的连通块的期望亮的个数就是sigma 每种情况 siz*p*hp,siz表示这种情况下根所在连通块大小,p表示这种情况下根所在连通块点亮的概率,hp表示这种情况出现的概率那么我们就把这个量记为sizphp,那么考虑点x的儿子原创 2017-03-27 09:46:51 · 378 阅读 · 0 评论 -
BZOJ4770 图样
牛逼的DP,一股TC气息 求期望的话可以先求出所有情况的和再除以情况数 考虑f[i][j]f[i][j]表示ii个点每个点的权值都是jj位的二进制数,最小生成树的和 一定是最高位为0的和为1的分别的形成生成树,然后两部分之间连一条边 那么枚举ii个点里有多少个点最高位是1 设g[i][j][k]g[i][j][k]表示左边ii个点,右边jj个点,每个数kk位,两部分之间所有情况最小边的和原创 2017-03-17 16:48:57 · 1015 阅读 · 2 评论 -
BZOJ1111 [POI2007]四进制的天平Wag
这种题号的题我之前竟然一直没做……先转成四进制,假设下标小的代表低位,下标大的代表高位那么问题就是让你把这个四进制数表示成两个四进制数的差,使得这两个四进制数各位上的数的和最小,并求方案数f[i]表示想表示出前i位最少要多少个砝码g[i]表示想表示出前i位,并且第i位在做减法的时候向第i+1位借了1的方案数转移很简单写代码的时候思路有点混乱,于是参照了一下claris的代码原创 2017-05-04 19:37:23 · 502 阅读 · 0 评论