随笔分类 - dp
摘要:直接把 r 加进去建虚树, 考虑虚树上的dp, 我们考虑虚树的dfs序的顺序dp过去。 dp[ i ][ j ] 表示到 i 这个点为止, 分成 j 组有多少种合法方案。 dp[ i ][ j ] = dp[ i - 1 ][ j ] * (j - have[ i ]) + dp[ i - 1 ][
阅读全文
摘要:Leaf Partition 考虑树形dp dp[ u ][ 0 ] 表示 u 这棵子树处理完, 不能向上延伸的方案数。 dp[ u ][ 1 ] 表示 u 这棵子树处理完, 必须向上延伸的方案数。 dp[ u ][ 2 ] 表示 u 这棵子树处理完, 可以向上延伸的方案数。 然后转移的时候细心一点
阅读全文
摘要:可以发现最多只有n个列是有用的, 然后状压dp一下就好了。
阅读全文
摘要:Long Colorful Strip 感觉还是一个比较难的区间dp 贴个官方题解
阅读全文
摘要:The Maximum Subtree 考虑good tree 长什么样子, 除了一点可以有2个儿子有儿子以外, 其余点最多只能有一个儿子有儿子。 然后直接dp就好啦。
阅读全文
摘要:Card Bag 状态只会从a小转移到a大,随便dp就好了。
阅读全文
摘要:Zoning Restrictions 发现从左往右dp没有办法dp, 可以想到最大值的性质, 我们考虑构建笛卡尔树的过程。 如果 i 的l, r 的最大值, 那么经过 i 点的线段可以全部在枚举 i 的时候处理掉。 dp[ i ][ j ][ k ] 表示只关注i - j之间的点和线段所能得到的最
阅读全文
摘要:HDU - 5735 感觉还是对容斥不够熟悉啊。。 先用轮廓线dp求出f[ i ][ j ]表示 i 行 j 列 没有限制的方案数。 然后2^m枚举列的划分情况进行容斥。 对于每一种情况 t[ i ] 表示这种情况下, i 行没有限制的方案数。 g[ i ]表示这种情况下, i 行并且没有可以划分的
阅读全文
摘要:HDU - 5735 感觉这个思路相当巧妙啊。。 考虑最普通的 dp[ i ] = max(dp[ j ] + w[ i ] opt w[ j ]), j 是 i 的祖先。 把(2 << 16) 分成前八位和后八位去优化最朴素的dp。 修改遍历后八位, 查询遍历前八位。
阅读全文
摘要:HDU - 5765 一个bond肯定把n个点分成两个连通块, 并且每个集合对应一个bond, 因为当前这个集合属于第一个连通块, 那么它的补集就输入另一个连通块, ok[ mask ] 表示 mask这些点集能否成为一个连通块。 我们称一个分配方案mask是好的当且仅当ok[ mask ] ==
阅读全文
摘要:HDU - 5789 这个题真的是有点恶心了。 ans[ i ] 表示以 i 为根的子树的答案, 也就是所有合法排列的逆序对数量。 way[ i ] 表示以 i 为根的合法排列数量。 dp[ i ][ j ][ k ] 表示以 i 为根所有合法排列中 j 节点排在第 k 个的合法排列数量。 然后用这
阅读全文
摘要:HDU - 5787 直接数位dp就好了。
阅读全文
摘要:HDU - 5800 第一感觉就是算每个 <= s的子集的贡献, 如果一个自己长度为k, 那么贡献为 C(k, 2) * C(n - k, 2), 然后就需要一个n3的dp去记录长度以及重量和。 感觉以前没有写过这个dp。。。 其实我们不需要记录长度, 我们只需要记录已经选了几个必选的, 和选了几个
阅读全文
摘要:HDU - 5815 感觉要是值域范围是1000以内, 感觉还是能写出来的。。 考虑dp[ i ][ j ]表示从 1 到 i 路径上的值是 j , i 这棵子树的最大贡献值。 然后可以发现 j 这维可以离散化, 离散化之后最优值不会变, 然后dp一遍就好了。
阅读全文
摘要:HDU - 5819 我们考虑每个向左的点, 从左往右进行转移。 f[ i ][ j ] 表示前 i 个点攻击完之后, 剩下 j 个点向右移动的概率。 考虑转移 f[ i ][ j ] = sum(f[ i - 1 ][ k ] * 2 ^ (k - j - 1)) k >= j f[ i ][ 1
阅读全文
摘要:HDU - 5823 枚举子集, 把一种颜色的一起加进去dp, 感觉3^n的复杂度不知道为啥跑这么快。 可以用fwt优化到(2 ^ n) * n * n
阅读全文
摘要:HDU - 5854 二分答案之后, 设答案值为v, x为小于等于v的边的数量, y为大于v的边的数量, 列出方程 x > (x + y) / k == (k - 1) * x - y > 0, 感觉有点像线性规划的样子。 然后用树形dp去check, 判合不合法的时候可以优化成一个R, 但是不优化
阅读全文
摘要:HDU - 5845 dp[ i ] 表示分完前 i 段, 最多能分几段。 我们能得到一个n2的dp, 然后用字典树优化掉。 我用了一个multiset去维护删除, 但实际上因为dp值有单调性, 所有维护sz就够了。 换成c++卡内存卡过去的。
阅读全文
摘要:6647 比赛的时候, 用了一种垃圾树hash,没过去。。
阅读全文
摘要:HDU - 5330 感觉这种dp和子集和dp差不多, 有点难想到。 dp[ i ][ S ][ j ] 表示最低的 i 位和 S最低的 i 位一样的所有串中, 和 S 的距离为 j 的有多少个。
阅读全文