考试的时候由于总是搞这道题导致爆零~~~~~(神™倒序难度.....) 考试的时候想着想着想用状压,但是觉得不行又想用区间dp,然而正解是状压着搞区间,这充分说明了一件事,状压不是只是一种dp而是一种用用二进制表示状态的方法,之前打的状压dp只不过是在线性dp的时候用了这种方法. 我们发现对于一个固定长度的区间他最后缩成的位数是一定的(且属于1~k-1),而且最后的每一位的数字的来源相互独立因为他们分别完全展开之后无交.那么我们按照区间dp的一般思路,扩展长度转移状态,我们将转移来源分为两部分,…
字符合并 Description 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这 k 个字符确定.你需要求出你能获得的最大分数. Input Format 第一行两个整数n,k.接下来一行长度为n的01串,表示初始串. 接下来2^k行,每行一个字符ci和一个整数wi,ci表示长度为k的01串连成二进制后按从小到大顺序得到的第i种合并方案得到的新字符,wi表示对应的第i种方案对应获得的分数. 1<=n<=300,0<…
4565: [Haoi2016]字符合并 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 690  Solved: 316[Submit][Status][Discuss] Description 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字 符和分数由这 k 个字符确定.你需要求出你能获得的最大分数. Input 第一行两个整数n,k.接下来一行长度为n的01串,表示初始串.接下来…
https://blog.csdn.net/xyz32768/article/details/81591955 首先区间DP和状压DP是比较明显的,设f[L][R][S]为将[L,R]这一段独立操作最终得到的字符序列为S的最大收益.其中S的位数为(R-L)%(k-1)+1. 枚举R第一次参与的操作的左端点mid与这次操作得到的数转移,若当前长度为k则要加上当前操作收益. 注意这个mid和R的距离一定是k-1的倍数,这样总状态和转移就很少,于是可以$O(n^32^8)$通过. #include<c…
传送门 当看到那个k≤8k\le 8k≤8的时候就知道需要状压了. 状态定义:f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]处理完之后的状态为kkk时的最大贡献. 由于每次合并会减少K−1K-1K−1个,因此0<k≤K−10<k\le K-10<k≤K−1. 然后转移的时候不用一个一个转移. 两次转移的断点的距离需要保证是k−1k-1k−1,因为这样子肯定不必之前距离不为k−1k-1k−1时更优. 注意处理特殊情况(整个区间刚好可以被消…
传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 取模的结果) 好巧妙的转化啊: 构造一个矩阵,把限制关系转化成矩阵的相邻元素不能同时选 1 3  9  27… 2 6 18 54… 4 12 36 108… 然后愉♂悦的状压DP就可以啦 注意每一个既不被$2$又不被$3$整除的数都可以作为矩阵的第一个元素,还有矩阵不一定填满 #include…
设f[i][j][k]为将i~j的字符最终合并成k的答案.转移时只考虑最后一个字符是由哪段后缀合成的.如果最后合成为一个字符特殊转移一下. 复杂度看起来是O(n32k),实际常数极小达到O(玄学). upd:突然发现根本没在bzoj上交.bzoj的数据输入中没有空格. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #i…
传送门 题意: $n$个公交站点,$k$辆车,$1...k$是起始站,$n-k+1..n$是终点站 每个站只能被一辆车停靠一次 每辆车相邻两个停靠位置不能超过$p$ 求方案数 $n \le 10^9,\ p \le 8,\ k \le 10$ 思考过程中遇到的主要问题是“所有车是同时前进的”,既不能单独考虑一辆车又没法考虑前面的车队后面的影响 正确的做法是同时考虑所有车 每$p$个位置一定每辆车各停一次 $f[i][s]$表示当前在站点$i$,且$i$有车,$s$为车停靠状态 强制规定最靠左(即…
题意: $n$个人排队打饭,第$i$个人口味$a_i$,能容忍最多身后第$b_i$个人先打饭. 先后两人$i,j$做饭时间为$a_i & a_j - a_i | a_j$ 求最少时间 一开始想$f[i][s]$表示第$i$个人身后人吃饭集合$s$,第$i$个人最后吃完的状态,发现没法转移 这时候应该考虑给状态加维 $f[i][s][k]$表示前$i-1$人吃完,$i$身后包括$i$的吃饭集合为$s$,最后一个吃完的人是$k$的最短时间 如果$i$吃完了,可以直接转移到$i+1$:否则枚举下一个谁…
传送门 题意: 一个无向图,从$1$到$n$,要求必须经过$2,3,...,k+1$,给出一些限制关系,要求在经过$v \le k+1$之前必须经过$u \le k+1$ 求最短路 预处理出$1...k+1$到其他点的最短路 然后$f[i][s]$表示当前在$i$已经经过的点的集合为$s$的最短路 只考虑$1,2,...,k+1$就行了, 注意$1$也要考虑,一个点可能经过多次 然后实测dij比spfa快....我想试$pb\_ds$来着结果发现我的电脑上没有ext/pb_ds/priority…