随笔分类 - 各种DP
摘要:传送门 考虑简单的容斥 设 F(n,m) 表示 a∈[1,n],b∈[1,m] 的满足 a+b=a xor b 的数对的数量 那么答案即为 F(r,r)−2F(l−1,r)+F(l−1,l−1) 意思就是总方案减去 a,b 至少一个数小于 $
阅读全文
摘要:传送门 显然这个图是个 DAG ,那么就可以考虑跑 dp 了 先考虑没有梯子的情况,首先把每个位置标号,越后面的位置编号越小,终点位置编号为 1 那么从终点往起点 dp ,枚举当前位置摇到的数字,那么有 $f[x]=\frac{\sum_{i=1}^{6}(f[x-i]+1)}{6}
阅读全文
摘要:传送门 设 f[x][i] 表示 x 的子树中,离 x 最近的选择的节点距离为 i 的合法方案的最大价值 设 val[x] 表示节点 x 的价值,首先有 f[x][0]=val[x] 那么考虑子树的合并,有 $f[x][min(i,j+1)]=max(f[x][min(i
阅读全文
摘要:传送门 首先显然下楼的操作一定是不优的,所以只要考虑上楼 设 f[i] 表示到第 i 层时需要的最少时间 那么首先考虑走楼梯,有转移,f[i]=f[i−1]+a[i−1] 然后考虑坐电梯有:f[i]=f[j]+(∑i−1k=jb[k])+c 显然那个 $\sum b
阅读全文
摘要:传送门 显然考虑 n2 的树形 dp 设 f[x][i] 表示 x 的子树内选了 i 个节点染黑,子树内所有边对整颗树的最大贡献 考虑子树的合并,显然对于 (u,v),v∈son[u] ,设边权为 w ,这条边的贡献可以通过 v 子树内的黑节点数算出 因为确
阅读全文
摘要:传送门 cf 自闭了,打 abc 散散心 A - 9x9 ...这个有什么好讲的吗,题目看懂就会做了 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using
阅读全文
摘要:传送门 显然考虑 dp ,设 fx[i][j] 表示从 (i,j) 出发往下走一格,最终到达 (n,m) 的方案数,fy[i][j] 表示从 (i,j) 出发往右走一格,最终到达 (n,m) 的方案数 如果 (i,j) 本身有石头就把这个石头忽略 那么对于 $fx[i
阅读全文
摘要:传送门 首先考虑怎么算 f(n) (就是题目里面那个 f(n)) 发现可以构造一组序列大概长这样: ${1,3,2,6,5,4,10,9,8,7,15,14,13,12,11,...,n(n+1)/2,n(n+1)/2-1,n(n+1)/2-2...n(n+1)/2-(n-1),(n+1)(
阅读全文
摘要:传送门 首先可以注意到序列里面元素的顺序对答案是没有影响的,所以二话不说先排序再看看怎么搞 考虑枚举每种子序列可能产生的贡献并算一下产生这个贡献的子序列有多少 考虑设 F(x) 表示选择的元素差值至少为 x 的长度为 k 的子序列的方案数 那么最终如果直接把每个 $F(x),x \in
阅读全文
摘要:传送门 注意到连续两个格子如果有相同颜色那么一路过去的都可以确定 比如一开始染了这两个位置: 然后发现后面整片过去都可以确定: 对于横着的情况也是一样,然后就会发现不可能出现横着两个和竖着两个同时都有的情况,因为这样一定会冲突,就一定不合法了 (自己画一下就知道了) 那么现在只要对行列分别计算即可,
阅读全文
摘要:传送门 这个显然考虑容斥,那么答案就是总方案数减去至少有一个 1 的方案数加上至少有两个 1 的方案数减去至少有三个 1 的方案数... 即 ans=∑max(a)x=0(−1)cnt[x](2f[x]−1) ,其中 cnt[x] 表示 x 二进
阅读全文
摘要:传送门 由提示可以知道,如果把图中的边从小到大依次加入,在加入第 k 条边时图恰好联通,那么期望花费为 km+1 注意到期望花费和加入边数成正比,发现可以看成每一条加入后不使图联通的边的贡献之和,每条不使图联通的边的贡献即为 1m+1 那么如果能算出
阅读全文
摘要:传送门 首先设 f[x] 表示点分树上 x 的子树内的方案数 发现对于 x 的每个儿子 v ,x 似乎可以向 v 子树内的每个节点连边,因为不管怎么连重心都不会变 显然是错的,题目描述中说如果有多个重心取编号最小的,所以如果 v 的子树大小恰好为 x 的子树大小的一半
阅读全文
摘要:传送门 很妙的题 首先先考虑一个简化的问题,现在有一行格子让你填 你要么填一格 要么填两格 有的格子不让你填 问你填了 a 个一格和填了 b 个两格有多少种方案 那么显然先只考虑放两格的方案,这个可以简单 dp 得到,设 f[i][j] 表示前 i 个格子放了 j 个两格的方
阅读全文
摘要:传送门 这一题是真的坑人,时间空间都在鼓励你用 NTT 优化 dp...(但是我并不会 NTT) 看到题目然后考虑树形 dp ,设 f[i][0/1] 表示 i 个节点的树,根节点为奇数/偶数的方案数 然后发现对于 f[i][0/1] 的所有方案,把节点编号同时加一个偶数
阅读全文
摘要:话说BZOJ 是不是死了啊 (已经没有传送门了) 设 f[i][j] 表示走到第 j 个位置确定了 i 个存档点时的最小代价,并强制第 j 个位置有一个存档点 那么设 cst[i][j] 表示存档点在 i ,走到位置 j 的代价, f 有转移: $f[i][j]=f[
阅读全文
摘要:传送门 显然是可以树形 dp 的 对每个节点维护以下 5 个东西 1. 从当前节点出发往下的链的最大贡献 2. 节点子树内不经过本身的路径最大贡献 3. 节点子树内经过本身的路径的最大贡献 4. 从当前节点出发的一条链加上经过这条链的路径构成的图形的最大贡献 5. 从当前
阅读全文
摘要:传送门 三个限制都可以数位 dp , dfs 是维护当前位,之前各位总和模 7 意义下的值,之前填的数模 7 意义下的值,是否贴着限制 主要现在求的是各个合法数的平方的和,比较恶心 开一个结构体维护一下三个东西,合法数的个数,合法数的和,合法数的平方和 前两个好维护,平方和发现其实可
阅读全文
摘要:传送门 注意到 m 只有 20 ,考虑一下状压 dp 设 f[S] 表示当前确定的字符集合为 S ,那么转移就考虑从最右边加入的下一个字符 c 那么问题来了,代价如何计算 考虑每次加入一个字符以后对于所有字符间的移动(ci,ci+1)产生的代价 那么显然只有当 $
阅读全文
摘要:传送门 首先每个点 u 只能选择不超过 k 个相连的边 并且设边为 (u,v) ,那么此时 v 也必须选择这条边 因为图是一颗树,显然考虑一下树形 dp 设 f[x][0/1] 表示考虑完 x 的子树,当前节点有没有留一个选择给和父亲相连的边(0 表示没有) 那么对于
阅读全文