随笔分类 -  dp

摘要:Parcels 感觉很巧妙的题呀。。 没想到转移的时候也需要一个dp, 就怎么算怎么感觉复杂度不对。。 dp[ i ][ s ] 表示 i 作为最底层的块, 它上面最多能放重量为 s 的最优值。 我们将包裹先按R小排, 再按L大排, 这样对于 i 这个包裹来说, 能放在它上面的都在它左边。 对于dp 阅读全文
posted @ 2019-05-09 14:57 NotNight 阅读(190) 评论(0) 推荐(0)
摘要:World of Darkraft - 2 每个武器可以独立考虑贡献, 我们算单个武器的贡献。 考虑最朴素的dp, dp[ i ][ j ] 表示当前还有 i 个怪没有打, 当前的武器等级是 j 最后获得硬币的期望。 这显然是个n ^ 2的dp, 但是通过观察我们能发现, j 达到很大的概率非常小, 阅读全文
posted @ 2019-05-08 19:40 NotNight 阅读(184) 评论(0) 推荐(0)
摘要:Positions in Permutations 先dp出选 k 个的方案数, 这个很简单, dp[ i ][ j ][ u ][ v ]表示到 i 为止选了 j 个, i - 1的选取情况是 u, i 的选取情况是 v 的方案数。 然后最后容斥一下, 容斥系数是 C(i, k)。(虽然我不会证明 阅读全文
posted @ 2019-05-08 11:20 NotNight 阅读(170) 评论(0) 推荐(0)
摘要:Delivery Club 首先二分答案, 我们考虑dp去check 我们可以发现所有状态要从两个点在 i 和 i - 1转移过来。 所以我们令dp[ i ] 表示 能否到达两个快递员在分别 i 号点 和 i - 1号点的状态。 转移就是把在 i 号位置的快递员不断地往后移, 如果能移到 j && 阅读全文
posted @ 2019-05-08 00:02 NotNight 阅读(289) 评论(0) 推荐(0)
摘要:Connecting Vertices 这种题就是看一眼就知道区间dp, 写一天也写不出来。。 f[ i ][ j ]表示区间[ i, j ] i 和 j 连边所构成的方案数。 g[ i ][ j ]表示区间[ i, j ] i 和 j 不连边所构成的方案数。求g 的时候枚举 j 和 k (并且这个 阅读全文
posted @ 2019-05-07 19:29 NotNight 阅读(279) 评论(0) 推荐(0)
摘要:Fibonacci String Subsequences 读题把子序列读成子串, 码都码完了, 样例不对, 人傻了。 我dp的是每个匹配串的贡献, 然后发现子序列的话算贡献维护不了。。 没想到直接dp的就是在子序列中出现的次数。 dp[ i ][ l ][ r ] 表示的是在 F[ i ]这个串中 阅读全文
posted @ 2019-05-07 14:00 NotNight 阅读(217) 评论(0) 推荐(0)
摘要:Tanks 最关键的一点就是怎么判方案是否存在。。 只要存在若干个坦克之和的sum % k == v % k 就有解, 否则无解。 我怎么想不到呢。。。 阅读全文
posted @ 2019-05-06 19:56 NotNight 阅读(136) 评论(0) 推荐(0)
摘要:Vasya and Maximum Matching 首先能观察出, 只有完美匹配的情况下方案数唯一。 dp[ i ][ 0 ], dp[ i ][ 1 ], dp[ i ][ 2 ] 分别表示 对于 i 这棵子树 0: 不向上连边完成 1:向上连边完成 2:向上连边未完成 的方案数 阅读全文
posted @ 2019-05-06 17:15 NotNight 阅读(178) 评论(0) 推荐(0)
摘要:Flights for Regular Customers 临接矩阵的 k 次 就是 恰好 走 k 步从 i 走到 j 的方案数, 方案数在这里并不关键, 所以可以把它变成01矩阵。 一个很直观的想法是用二分取check它, 但是这并不单调。。 然后就不会了。。 我们可以把G[ n - 1] [ n 阅读全文
posted @ 2019-05-06 12:50 NotNight 阅读(179) 评论(0) 推荐(0)
摘要:Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊。。。。 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串的 第 j 个, 已经放了 k 个左括号, 是否存在所给串的方案数。 因为不匹配的不是从头开始的, 阅读全文
posted @ 2019-04-29 16:48 NotNight 阅读(135) 评论(0) 推荐(0)
摘要:Streets and Avenues in Berhattan 我们首先能发现在最优情况下最多只有一种颜色会分别在行和列, 因为你把式子写出来是个二次函数, 在两端取极值。 然后我们就枚举哪个颜色会分别在行和列。 然后枚举这种颜色在行的个数, 再求出需要在列放的最少的这种颜色的个数。 这个我们可以 阅读全文
posted @ 2019-04-29 16:06 NotNight 阅读(161) 评论(0) 推荐(0)
摘要:Zublicanes and Mumocrates dp[ i ][ j ][ k ] 表示 以 i 为根的子树, 占领 i 的 是 j 并且第一个人占了 i 子树的 k 个叶子节点的最小值。 然后随便d 1 d 就好了。 阅读全文
posted @ 2019-04-29 11:22 NotNight 阅读(142) 评论(0) 推荐(0)
摘要:看别人写的才学会的。。。 我们考虑刚开始的一个点, 然后我们枚举接上去的一条一条链, dp[mask]表示当前已经加进去点的状态是mask所需的最少边数。 反正就是很麻烦的一道题, 让我自己写我是写不出来的。。。 我好菜啊。 阅读全文
posted @ 2019-04-24 00:59 NotNight 阅读(383) 评论(0) 推荐(0)
摘要:The Minimum Number of Variables 我们定义dp[ i ][ mask ]表示是否存在 处理完前 i 个a, b中存者 a存在的状态是mask 的情况。 然后用sosdp处理出,状态为state的a, 能组成的数字, 然后转移就好啦。 阅读全文
posted @ 2019-04-23 13:02 NotNight 阅读(158) 评论(0) 推荐(0)
摘要:Little Elephant and Broken Sorting 怎么感觉这个状态好难想到啊。。 dp[ i ][ j ]表示第 i 个数字比第 j 个数字大的概率。转移好像比较显然。 阅读全文
posted @ 2019-04-22 19:54 NotNight 阅读(203) 评论(0) 推荐(0)
摘要:PolandBall and Gifts 转换成置换群后, 对于最大值我们很好处理。 对于最小值, 只跟若干个圈能否刚好组能 k 有关。 最直观的想法就是bitset优化背包, 直接搞肯定T掉。 我们能再发掘一些性质, 就是本质不能的圈的大小最多有sqrt(n)个, 因为1 + 2 + 3 ... 阅读全文
posted @ 2019-04-22 13:57 NotNight 阅读(187) 评论(0) 推荐(0)
摘要:On the Bench 两个数如果所有质因子的奇偶性相同则是同一个数,问题就变成了给你n个数, 相同数字不能相邻的方案数。 dp[ i ][ j ]表示前 i 种数字已经处理完, 还有 j 个位置需要隔开的方案数。 转移的话, 我们枚举第i + 1种数字分成的段数, 然后枚举有几段插到 j 个空格 阅读全文
posted @ 2019-04-22 00:49 NotNight 阅读(124) 评论(0) 推荐(0)
摘要:New Year and Old Subsequence 第一感觉是离线之后分治求dp, 但是感觉如果要把左边的dp值和右边的dp值合起来, 感觉很麻烦而且时间复杂度不怎么对。。 然后就gun取看题解了, 用线段树维护dp的值, 然后区间合并求答案。 每个节点保存dp[ i ][ j ]表示, 把当 阅读全文
posted @ 2019-04-21 19:28 NotNight 阅读(145) 评论(0) 推荐(0)
摘要:Allowed Letters 最直观的想法是贪心取, 然后网络流取check可不可行, 然后T了。 想到最大流可以等于最小割, 那么我们状压枚举字符代表的6个点连向汇点是否断掉, 然后再枚举64个本质不同的位置, 是否需要切段原点联想它的边, 单次check复杂度64 * 64 用sosdp能优化 阅读全文
posted @ 2019-04-18 00:13 NotNight 阅读(234) 评论(0) 推荐(0)
摘要:我们肯定要一大一小间隔开来所以 把式子拆出来就是类似这样的形式 s1 - 2 * s2 + 2 * s3 + ...... + sn 然后把状态开成四个, 分别表示在顶部, 在底部, 在顶部到底部的中间, 在底部到顶部的中间。 反思一下为什么没写出来:我在考虑的时候 |s2 - s1| + |s3 阅读全文
posted @ 2019-04-16 17:22 NotNight 阅读(265) 评论(0) 推荐(0)