随笔分类 -  dp

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

1 2 3 4 5 ··· 9 下一页