随笔分类 -  动态规划

摘要:设f[i]为在i放置守卫塔时1~i的最小花费。那么显然f[i]=min(f[j]+(i-j)*(i-j-1)/2)+a[i]。 显然这是个斜率优化入门题。将不与i、j同时相关的提出,得f[i]=min(f[j]+j*(j+1)/2-ij)+i*(i-1)/2+a[i]。 套路地,假设j>k且j转移优 阅读全文
posted @ 2018-09-17 23:01 Gloid 阅读(164) 评论(0) 推荐(0)
摘要:考虑有序选择各子集,最后除以m!即可。设f[i]为选i个子集的合法方案数。 对f[i]考虑容斥,先只满足所有元素出现次数为偶数。确定前i-1个子集后第i个子集是确定的,那么方案数为A(2n-1,i-1)。 显然不能为空集,于是去掉前i-1个已经满足限制的方案,也即f[i-1]。 然后去掉第i个子集和 阅读全文
posted @ 2018-09-15 00:16 Gloid 阅读(131) 评论(0) 推荐(0)
摘要:显然答案只与a、b、c中各自1的个数及位数有关。a、b只考虑前i位怎么填时,c最多在第i+1位上为1,而第i+1位及之后的a、b怎么填都不会对前i位造成影响。于是设f[n][i][j][k][0/1]表示只考虑前n位,a用i个1,b用j个1,c用k个1,且c的第n+1位为0/1时的最小值。转移时枚举 阅读全文
posted @ 2018-09-14 20:03 Gloid 阅读(137) 评论(0) 推荐(0)
摘要:令f[i][0/1/2][0/1]表示前i位,不存在满足要求的B串和W串/存在满足要求的B串不存在W串/存在满足要求的B串和W串,第i位填的是B/W的方案数。转移时考虑连续的一段填什么。大讨论一波后瞎优化一波就成线性的了。k=1应该是要特判一下的不过数据里没有那就不管了。 成功的把这么短的题面都看错 阅读全文
posted @ 2018-09-14 02:26 Gloid 阅读(135) 评论(0) 推荐(0)
摘要:由于Bi<=7,考虑状压。 如果考虑前i个位置的话,状态里需要压入前7个人后7个人,显然是跑不动的。 那么改成考虑前i个人。于是设f[i][j][k]表示前i个人都已吃完饭,i+1后面7个人的吃饭状态为j,最后一个吃饭的人是k的答案。转移时考虑下一个吃饭的是谁即可。 a|b-a&b=a^b。当然没什 阅读全文
posted @ 2018-09-13 20:03 Gloid 阅读(134) 评论(0) 推荐(0)
摘要:容易发现有了交换相邻字符的操作后,只要字符串所含有的字符种类和数量相同其就是等价的。这样的状态只有n^3级别,将其抽象成点子串变换抽象成边后就是求最长路径了,缩点dp解决。 码量巨大,不是很明白要怎样才能用3k写完。 阅读全文
posted @ 2018-09-09 13:39 Gloid 阅读(218) 评论(0) 推荐(0)
摘要:完全想不到的第一步是构造一个矩阵,使得每行构成公比为3的等比数列,每列构成公比为2的等比数列。显然矩阵左上角的数决定了这个矩阵,只要其取遍所有既不被2也不被3整除的数那么所得矩阵的并就是所有的数了,并且显然不会有重复。 现在要满足题目要求只需要使在矩阵中选取的数不相邻。显然这可以用状压dp以4^n* 阅读全文
posted @ 2018-09-07 20:11 Gloid 阅读(166) 评论(0) 推荐(0)
摘要:容易发现x nand x=not x。并且使用这个性质有x and y=not(x nand y)=(x nand y)nand(x nand y)。也就是说nand运算可以作为not和and运算使用。并且显然not和and运算可以表示nand运算,那么两者等价。事实上这就可以表示所有位运算了。 那 阅读全文
posted @ 2018-09-06 22:55 Gloid 阅读(138) 评论(0) 推荐(0)
摘要:考虑暴力dp:f[i][j]表示i个数值域1~j时的答案。考虑使其值域++,则有f[i][j]=f[i][j-1]+f[i-1][j-1]*i*j,边界f[i][i]=i!*i!。 注意到值域很大,考虑能不能在这一维上优化。完全不会证地有f[i][j]是一个关于j的2i次多项式。那么dp出一部分后就 阅读全文
posted @ 2018-09-05 22:34 Gloid 阅读(325) 评论(0) 推荐(0)
摘要:考虑对一个串如何分割能取得最大值。那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串。于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根。 然后考虑dp。设f[i][j]表示前i位走到AC自动机上j节点的概率,枚举下个字符即可转移。同时记录此时期望伤害,找到合法串就统计入答案。 阅读全文
posted @ 2018-09-04 00:09 Gloid 阅读(138) 评论(0) 推荐(0)
摘要:显然可以dp。显然可以单调队列优化一下。 阅读全文
posted @ 2018-09-02 13:45 Gloid 阅读(166) 评论(0) 推荐(0)
摘要:大讨论。注意去重。 阅读全文
posted @ 2018-09-01 22:34 Gloid 阅读(202) 评论(0) 推荐(0)
摘要:对于排列计数问题一般把数按一个特定的顺序加入排列。这个题做法比较显然,考虑将数从小到大加入排列即可。 阅读全文
posted @ 2018-08-31 15:39 Gloid 阅读(232) 评论(0) 推荐(0)
摘要:令f[i][j]表示连i条边时奇点个数为j的方案数,转移时讨论两奇点相连、一奇一偶相连、两偶点相连即可。注意这样会造成重边,那么算出恰好有一条重边的方案数并减掉。由于是有序地考虑每条边,每次还要除以i。 阅读全文
posted @ 2018-08-30 00:35 Gloid 阅读(274) 评论(0) 推荐(0)
摘要:根据组合意义,有nk=ΣC(n,i)*i!*S(k,i) (i=0~k),即将k个有标号球放进n个有标号盒子的方案数=在n个盒子中选i个将k个有标号球放入并且每个盒子至少有一个球。 回到本题,可以令f[i][j]表示ΣC(dis(i,k),j) (k为i子树中节点),通过C(i,j)=C(i-1,j 阅读全文
posted @ 2018-08-29 13:03 Gloid 阅读(195) 评论(0) 推荐(0)
摘要:要求最大值最小容易想到二分答案。首先对每个点求出子树中与其最远的距离是多少,二分答案后就可以标记上一些必须在所选择路径中的点,并且这些点是不应存在祖先关系的。那么如果剩下的点数量>=3,显然该答案不可行;=0,显然可行;=1,由该点沿其到根的路径往上爬,并计算最远距离判断是否合法;=2,求出两点lc 阅读全文
posted @ 2018-08-27 22:01 Gloid 阅读(187) 评论(0) 推荐(0)
摘要:令f[i]表示i子树内最少染色次数,加上012状态分别表示该子树内叶节点已均被满足、存在黑色叶节点未被满足、存在白色叶节点未被满足,考虑i节点涂色情况即可转移。事实上贪心也可以。 阅读全文
posted @ 2018-08-27 18:51 Gloid 阅读(143) 评论(0) 推荐(0)
摘要:第一眼生成函数。四个等比数列形式的多项式相乘,可以化成四个分式。其中分母部分是固定的,可以多项式求逆预处理出来。而分子部分由于项数很少,询问时2^4算一下贡献就好了。这个思路比较直观。只是常数巨大,以及需要敲一发类似任意模数ntt的东西来避免爆精度。成功以这种做法拿下luogu倒数rank1,至于b 阅读全文
posted @ 2018-08-13 02:03 Gloid 阅读(212) 评论(0) 推荐(0)
摘要:相当于给树上的每个点分配一个编号使父亲和儿子间都有连边。 于是可以考虑树形dp:设f[i][j][k]为i号点的编号为j,其子树中编号集合为k的方案数。转移显然。然而复杂度3n·n3左右,具体我也不知道是多少,但肯定跑不过。 如果状态有集合的话不管怎样底数都是3了,考虑能不能变成2。完全不能可以想到 阅读全文
posted @ 2018-08-12 14:39 Gloid 阅读(174) 评论(0) 推荐(0)
摘要:由数据范围容易想到矩阵快速幂和状压。 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台。可以发现这既是必要的,也是充分的。 开始的时候所有车是相邻的。考虑每次把一辆公交车塞到前方第一个未到达的站台。这个时候公交车之间是没有区别的,因为只要保证每相邻p个站台每辆车都 阅读全文
posted @ 2018-08-11 15:27 Gloid 阅读(155) 评论(0) 推荐(0)