随笔分类 - 动态规划——状压
摘要:Description 给定一个环形的01序列,保证任意相邻的m个值中有不超过k个1,求满足要求的方案数对1e9+7取模的值 Solution 状压dp+矩阵快速幂 由于m的范围很小,所以我们考虑状压dp存储状态,而由于n很大,所以我们考虑矩阵快速幂优化转移 我们定义$f(i,j)$表示前i个数最后
阅读全文
摘要:Description Solution 每个人能看到的动物只有5个,所以我们可以将这个进行状压,定义f[i][j]表示从第i开始的五个动物状态压缩后(移走或不移走)为j的最优结果 那么转移方程可以得到 其中,val表示这一步转移所获得的收益,由于动物园是环形的,所以初状态等于末状态,我们枚举末状态
阅读全文
摘要:这是一道树形dp和状压dp结合的题目,思考量和代码细节都不少。 我们首先定义f[i][j]表示在以i为根的子树当中,建立分部的节点状压之后为j的最大收益 那么转移是显然的,定义k为i的儿子,那么f[i][j] = max(f[k][l] + f[i][j ^ l] + val). 其中val表示其他
阅读全文
摘要:这是一道状压dp的入门练习题 我们可以预处理出每一行国王的合法摆放方案,然后进行dp。 我们定义f[i][j][k]表示前i行,第i行的状态为j且使用了k个国王的合法方案数,那么存在 f[i][j][k]=∑f[i-1][j'][k'],其中j&j'=0,j&j'<<1=0,j&j'>>1=0 注意
阅读全文
摘要:尽管本题依旧是状压dp,但是不同的是本题的状态无法用二进制表示,而需要三进制。三进制特殊的地方在于位运算符全都不能用了,因此本题比往常的题目多了一部分,就是手写判断,而不是直接&,|,^. 可喜的是,本题状态定义极其简单,定义f[i][j]表示第i行的状态为j时,前i行的方案数,这样一来,本题与“国
阅读全文
摘要:一道入门的状压dp题,很有意思也很简单。 定义f[i][j]表示第i行的状态为j时,前i行的方案总数,那么答案ans=∑f[n][j]. 考虑状态的转移,第i-1行的状态k能转移到第i行的j,当且仅当j&k==0且j,k分别符合他们自己放在那一行的条件,所以f[i][j]=∑f[i-1][k] (条
阅读全文
摘要:这是一道使用状压dp覆盖图形的问题,我们定义f[i][j][k]表示当第i行的状态为j,前i行一共k个国王时的方案数。其中,j表示将当前这一行状态压缩后对应的二进制数。状态转移方程为f[i][j][k]=∑f[i-1][x][num(x)].我们先预处理出每一个合法的状态,并记录他们用了多少国王,再
阅读全文
摘要:状压dp的一种经典模型,覆盖问题。 我们定义f[i][j]表示当第i行的状态为j时,前i行的方案数。显然答案为f[n][0]. 关于压缩状态,我们定义一个m位的二进制数,其中第i位为1的含义是,第i列是一个竖着的矩形的上半部分。第i位为0则表示其他情况。 因此,第i-1行的状态k能转移到第i行的状态
阅读全文
摘要:这道题算是搜索和状压的结合吧,作为状压的入门题还是不错的,能让人初步了解状压的含义及应用。 对这张图进行一遍拓扑排序,然后状压统计(我用了bitset)。 注意读入,因为我的读入优化挂掉了…… 1 #include <iostream> 2 #include <cstdio> 3 #include
阅读全文
摘要:本人是NOIP2018省二的蒟蒻,最近练习状压,总感觉楼下的题解晦涩难懂,我决定自己写一篇题解造福一下广大蒟蒻 首先看数据范围就猜到了状压dp…… 设f[i]表示完成状态i(二进制位,状压)这些歌获得的奖励; 则答案为f[(1<<n)-1]。 对于一个状态i,若第j首歌没完成,即i&(1<<j-1)
阅读全文