随笔分类 -  动态规划

摘要:设f[i][j][x][y]为安排了i个男孩j个女孩,后缀最大男孩-女孩数为x,最大女孩-男孩数为y的方案数。转移显然。 阅读全文
posted @ 2018-10-31 21:52 Gloid 阅读(156) 评论(0) 推荐(0)
摘要:如果n、m、k都是2的幂次方,答案非常好统计。于是容易想到数位dp,考虑每一位是否卡限制即可,即设f[i][0/1][0/1][0/1]为第i位是/否卡n、m、k的限制时,之前的位的总贡献;g[i][0/1][0/1][0/1]为第i位是/否卡n、m、k的限制时,之前的位的方案数。为了方便可以改为统 阅读全文
posted @ 2018-10-31 21:24 Gloid 阅读(186) 评论(0) 推荐(0)
摘要:数据范围过大说明这个题和组合一点关系也没有,答案基本上肯定是ab的形式了。暴力打表感觉不太好写,找到当年的题面发现还有个样例是6 40 401898087,于是暴力找ab=401898087的数,发现一组a=64 b=40,可以发现a=2n b=k,同时也符合第一组数据,于是就做完了。 可以发现集合 阅读全文
posted @ 2018-10-30 19:10 Gloid 阅读(330) 评论(0) 推荐(0)
摘要:相当于选一个包含根的连通块使权值和最大,且每个点的儿子选取数量有限制。那么显然贪心的在所有子树中选比较大的就可以了。至于方案是否唯一只需要看选的子树是否可以替换,注意dp值为0的情况。 阅读全文
posted @ 2018-10-30 18:17 Gloid 阅读(155) 评论(0) 推荐(0)
摘要:设f[i][j]为由根进入遍历完i子树,最后一个到达的点是j时的最小代价,g[i][j]为由子树内任意一点开始遍历完i子树,最后一个到达的点是j时的最小代价,因为是一棵完全二叉树,状态数量是nlogn的。转移考虑四种走法:根→左子树→右子树;根→右子树→左子树;左子树→根→右子树;右子树→根→左子树 阅读全文
posted @ 2018-10-30 11:24 Gloid 阅读(257) 评论(0) 推荐(0)
摘要:当n大到一定程度(>21)时一定无解,并不会证。 如果要取出一个排列,显然应该让每一位在序列中的位置尽量靠前。于是设f[S]表示存在S子集中这些字母所组成的所有排列的最短前缀的长度,枚举当前排列最后一个字母转移即可。 阅读全文
posted @ 2018-10-29 15:56 Gloid 阅读(257) 评论(0) 推荐(0)
摘要:小凯的疑惑升级版。只有两个数的话不能表示的最大数是ab-a-b,显然如果可选数增加不会比这更大,所以只要答案存在一定小于256*256-2*256。在这个范围内背包即可。 阅读全文
posted @ 2018-10-28 20:59 Gloid 阅读(169) 评论(0) 推荐(0)
摘要:首先dp出长度为i的不下降子序列个数,显然这可以树状数组做到O(n2logn)。 考虑最后剩下的序列是什么,如果不管是否合法只是将序列删至只剩i个数,那么方案数显然是f[i]*(n-i)!。如果不合法,说明这个序列是由一个长度为i+1的非降序列删除一个数得来的,所以将其减去f[i+1]*(i+1)* 阅读全文
posted @ 2018-10-28 11:44 Gloid 阅读(288) 评论(0) 推荐(0)
摘要:由nim游戏的结论,显然等价于去掉一些数使剩下的数异或和为0。 暴力的dp比较显然,设f[i][j][k]为前i堆移走j堆(模意义下)后异或和为k的方案数。注意到总石子数量不超过1e7,按ai从小到大排序,这样k的枚举范围就不会超过2ai,于是复杂度O(md)。 注意空间卡的非常紧,连滚动都开不下, 阅读全文
posted @ 2018-10-27 17:46 Gloid 阅读(191) 评论(0) 推荐(0)
摘要:考虑套路地将1~n依次加入排列。设f[i][j]为已将1~i加入排列,有j对不合法的方案数。加入i+1时可能减少一对不合法的,可能不变,可能增加一对,对于i+1与i的关系再增设0/1/2状态表示i与左边/右边的数是否构成不合法对即可。 阅读全文
posted @ 2018-10-27 02:01 Gloid 阅读(177) 评论(0) 推荐(0)
摘要:设f[i][0/1]为考虑前i位,第i位为0/1时的期望得分(乘以是0/1的概率)。暴力转移显然。前缀和优化即可。 但是这个前缀和精度无法承受,动不动就nan。 考虑增加一位的贡献。若之前后缀1的个数为x,则增加一个1的贡献为(x+1)3-x3=3x2+3x+1。因此记录后缀1的个数期望、后缀1的个 阅读全文
posted @ 2018-10-26 19:43 Gloid 阅读(273) 评论(0) 推荐(0)
摘要:设f[i][j]为前i个数中所选择的最后一个数在第j位上为1时的最长序列长度,转移显然。 阅读全文
posted @ 2018-10-24 01:35 Gloid 阅读(146) 评论(0) 推荐(0)
摘要:相当于一个有负体积的背包。显然如果确定了选哪些,应该先把体积小的挂上去。于是按体积从小到大排序,就是一个裸的背包了。 阅读全文
posted @ 2018-10-23 00:58 Gloid 阅读(190) 评论(0) 推荐(0)
摘要:显然每一行棋子的某种放法是否合法只与上一行有关,状压起来即可。然后n稍微有点大,矩阵快速幂即可。 阅读全文
posted @ 2018-10-20 23:31 Gloid 阅读(246) 评论(0) 推荐(0)
摘要:可以大胆猜想的一点是,只要有不少于一个长度为k的颜色相同子串,方案就是合法的。 直接算有点麻烦,考虑减去不合法的方案。 一个正(xue)常(sha)的思路是枚举序列被分成的段数,问题变为用一些1~k-1的数组成n的方案数,这显然是可以容斥的。但好像对每一种都进行容斥就不太好办了。 暴力二维dp是很容 阅读全文
posted @ 2018-10-20 15:21 Gloid 阅读(221) 评论(0) 推荐(0)
摘要:DAG中每个点选一条入边就可以构成一棵有向树,所以如果没有环答案就是∏degreei。 考虑去掉含环的答案。可以看做把环缩点,剩下的点仍然可以任意选入边。于是去除的方案数即为∏degreei/∏degreek,k为环上点。 环相当于考虑新加入边的终点到起点的所有路径。设f[i]为i为起点的所有路径提 阅读全文
posted @ 2018-10-20 01:47 Gloid 阅读(189) 评论(0) 推荐(0)
摘要:copy: Dilworth定理:DAG的最小链覆盖=最大点独立集 最小链覆盖指选出最少的链(可以重复)使得每个点都在至少一条链中 最大点独立集指最大的集合使集合中任意两点不可达 此题中独立的定义即是两点满足一个在左下一个在右上(或在同一格)。于是只需要找一条从左下到右上权值和最大的路径。 阅读全文
posted @ 2018-10-19 22:20 Gloid 阅读(156) 评论(0) 推荐(0)
摘要:按照子串出现的先后考虑。令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然。有点麻烦的是字典序,强行增加代码难度。 另一个比较简单的做法是上AC自动机,建出来后类似地令f[i][j]为已经出现的字符串集合为i,在自动机上点j 阅读全文
posted @ 2018-10-17 22:53 Gloid 阅读(188) 评论(0) 推荐(0)
摘要:dp容易想到,但没法进一步优化了。 考虑贪心,每次选出价值最大的物品。但这显然是不对的因为会影响其他物品的选择。 于是考虑加上反悔操作。每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两物品价值和-原物品价值。这样如果再次选择该物品就可以达到改为选择相邻两物品的效果。并且最优方案中相邻 阅读全文
posted @ 2018-10-16 20:47 Gloid 阅读(407) 评论(0) 推荐(1)
摘要:单纯的暴搜似乎还是很好写的,然而过不了。出完顺子之后答案是可以dp出来的,于是大力搜然后大力dp就好了。 dp时强行讨论完了几乎所有拆牌情况,理性愉悦一发。 阅读全文
posted @ 2018-10-14 16:03 Gloid 阅读(308) 评论(0) 推荐(0)