状压dp
文章平均质量分 61
Jozky86
这个作者很懒,什么都没留下…
展开
-
CF1208F Bits And Pieces(未解决)
CF1208F Bits And Piecesa 题意: 给定 n 个数的数组d,找到i<j<ki\lt j\lt ki<j<k 的 i,j,k,使得 di∣(dj&dk)d_i|(d_j \& d_k)di∣(dj&dk)最大 题解: 一开始以为是01字典树,看了题解说是SOSdp,emm没学过,队友会,等学会了更新。。 代码: ...原创 2021-10-23 17:14:25 · 100 阅读 · 0 评论 -
SOS_dp算法
Codeforces博客 简介: 前置知识:状压dp Sum over Subsets dynamic programming,简称Sos dp,状压dp的一种 用一个列题引出SOS dp: 给你一个由2N2^N2N个整数组成的确定数组A,我们需要计算对于任意的x,F(x)=所有A[i]的和sumF(x)=所有A[i]的和sumF(x)=所有A[i]的和sum且x&i=i,i是x的子集 整理成公式就是: F[mask]=∑i∈maskA[i]F[mask]=\sum_{i∈mask}A[i]F[ma原创 2021-10-23 16:44:58 · 790 阅读 · 0 评论 -
CF1550E Stringforces
CF1550E Stringforces 题意: 设 s 是一个由前 k 个小写字母构成的字符串,v 是前 k 个小写字母中的某一个。定义MaxLen(s,v)\mathrm{MaxLen}(s,v)MaxLen(s,v) 表示 s 所有仅由字母 v 构成的连续子串的最长长度。 定义 s 的价值为所有 MaxLen(s,v)\mathrm{MaxLen}(s,v)MaxLen(s,v) 的最小值,其中 v 取遍前 k 个小写字母。 现在给定一个长度为 n 的字符串 s,s 中字母要么是前 k 个小写字母中的原创 2021-10-20 18:54:18 · 107 阅读 · 0 评论 -
CF79D Password(P3943 星空)
CF79D Password(P3943 星空) 题意: 你有 n 个灯泡,一开始都未点亮。 同时你有 l 个长度,分别为 a1∼ala_1∼ a_la1∼al 每次你可以选择一段连续的子序列,且长度为某个 aia_iai,并将这些灯泡的明灭状态取反。 求最少的操作次数,使得最后有且仅有 k 个位置是亮的,这些位置已经给定,为 x1∼xkx_1 \sim x_kx1∼xk 1<=k<=10 1<=n<=10000 1<=l<=100 题解: k小于等于10,这么原创 2021-10-19 17:24:22 · 102 阅读 · 0 评论 -
C. 奇奇怪怪的魔法阵(未搞懂)
C. 奇奇怪怪的魔法阵 题意: n个点m条边,定义集合S为独立集,当且仅当任意x,y∈S,x与y之间没有边。空集也是独立集 现在对于每一个点的集合T,有多少子集为独立集 设N=0,1,…,n-1,AT=∑S⊂T[S是独立集]A_{T}=\sum_{S⊂T}[S是独立集]AT=∑S⊂T[S是独立集]。对于每一个T⊂N,求出ATA_TAT 1<=n<=26 题解: 看这个数据范围就很明显,复杂度是(1<<26),正好1s内 而且肯定是dp转移,但是还是不知道咋做,看了题解恍然大悟原创 2021-10-17 11:51:45 · 88 阅读 · 0 评论 -
icpc网络赛第二场K Meal
icpc网络赛第二场K Meal 题意: 有n个人,n个菜, 现在n个人轮流吃菜,起初S中有n个菜,第i个人会在还没拿走的菜中随机选一个,拿走第j个菜的概率为ai,j∑k∈Sai,k\frac{a_{i,j}}{\sum_{k∈S}a_{i,k}}∑k∈Sai,kai,j,然后将这个菜从集合S中删除,如果S为空则结束,否则轮到下一个继续拿菜 让你输出第i个人拿第j个菜的概率 n<=20 ,ai,ja_{i,j}ai,j<=100 题解: 比赛时想好大体思路,好不容易把A写完,调了半天,原创 2021-09-26 15:53:58 · 363 阅读 · 0 评论 -
P2157 [SDOI2009]学校食堂
P2157 [SDOI2009]学校食堂 题意: 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭。学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴。当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示。 由于人手不够,食堂每次只能为一个人做菜。做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为(a or b)-(a and b),而做第一道菜是不需要计算时间的。其中,or 和and 表示整数逐位或运算及逐位与运算,原创 2021-08-12 14:36:27 · 219 阅读 · 0 评论 -
P2167 [SDOI2009]Bill的挑战
P2167 [SDOI2009]Bill的挑战 题意: 有n个长度一样的字符串,字符串的每一位是?或者确定的字母,,求与这 N 个串中的刚好 K 个串匹配的字符串 T 的个数 1<=N<=15,1<=|S|<=50 题解: 很明显状态dp 我们可以先预处理一个match[1…len][a…z]:表示第i位取ch的状态,比如match[1]['a]=10101就表示第一个,第三个,第五个字符串的第一位可以取’a‘。预处理出match f[i][j]表示第i位的匹配上了j这个状态的方案数原创 2021-08-11 22:00:18 · 111 阅读 · 1 评论 -
NC51189 Mondriaan‘s Dream
NC51189 Mondriaan’s Dream 题意: n * m的矩阵,用1 * 2和2 * 1的砖快密铺,问多少种方法: 题解: 方法1: 我们现在规定砖头的竖放的上部分为1,砖头的横放或者是竖放的下部分为0 我们每两层进行分析,分析01的关系 我们设上层为k,下层为j 因为竖砖上为1下为0,所以上下两层&的结果必然都是0,j&k = = 0, 且j|k中连续的0均为偶数,因为竖砖和横砖的组合只有两种情况如下图: 蓝色字为两行或的结果,或的结果中0只能是连续偶数个出现,不可能连续奇原创 2021-05-05 16:23:32 · 122 阅读 · 0 评论 -
简单环题解
简单环 题解: 题目求环的情况 如果我们直接枚举会有很多重复,为了避免重复,我们枚举起点,其他的点的序号都必须比起点大,也就是x->y,x一定小于y dp[i][j]表示的是以i的第一个点作为起点的链的数量,j是终点 i是二进制,表示选择了哪些点 我们先当作链来考虑 我们从点j到点t, 状态转移: dp[i|(1<<(t-1))][t]=(dp[i|(1<<(t-1))][t]+dp[i][j])%mo; 前置条件为:i的第t-1位为0,i的第j-1位上为1(也可以是dp[i原创 2021-05-05 11:17:56 · 299 阅读 · 0 评论 -
郊区春游题解
郊区春游 题意: 给定一张图,求从某个起点出发,经过其中R个点(R个点给出)的最短路径(每个点经过且只经过一遍) 题解: 首先我们用floyed处理出任意两点的距离 dp[i][j]表示当前状态为i,当前所在的目标城市为j的最短路径 i为01串,1表示该点走过,0表示没走过 从点x到点y, 城市x已经走过:城市x是编号j的,所以(i&(1<<j))== 1,i的第j位是1,说明x走过 y还未走,所以(i&(1<<k)) == 0,i的第k位是0,说明y还没走,下一步可原创 2021-05-04 17:30:09 · 248 阅读 · 0 评论 -
Most Powerful
Most Powerful 题意: n个原子,当其中两个原子碰撞时,其中一个会消失,产生大量能量。现在知道每两个原子的碰撞表现,求出产生的能量总和的最大值 题解: 设dp[i]表示i状态下所获得的能量 i为二进制,第x位为1说明该位的原子已经消失 当j和k原子都还未消失(即i的第j位和第k位都是0),j和k碰撞会产生a[j][k]的能量,且k会消失,i将变成dp[i|(1<<k)] 所以得状态转移方程: dp[i|(1<<k)] = max(dp[i|(1<<k)],原创 2021-05-05 15:28:14 · 116 阅读 · 0 评论 -
NC14732 锁
NC14732 锁 题意: n个居民,门上有k把锁,每个居民有若干钥匙,为1到k的一个子集,如果几名居民的钥匙的并集是1到k,即他们拥有全部锁的对应钥匙。 求最小的k,使得可以适当地给居民们每人若干钥匙(即一个1到k的子集),使得任意重要度之和小于m的居民集合持有的钥匙的并集不是1到k,而任意重要度之和大于等于m的居民集合持有的钥匙的并集是1到k 题解: 思路很妙 很明显是状压 我的思路一开始都跑偏了,我想的是枚举每个人拥有的钥匙状态,但是钥匙的数量是未知的 我们这样想: 重要度不足m的不能开门,大于m的一原创 2021-05-20 23:54:01 · 110 阅读 · 0 评论 -
acwing 327. 玉米田
327. 玉米田 题意: m * n的土地,有的土地不育,有的可以种植,要求相邻的土地不能同时种植玉米,问有多少种种植方式 题解: 状压dp,先存每一行可能的状态,然后状态转移,注意相邻不能同时种植除了左右还有上下 代码: #include <bits/stdc++.h> using namespace std; const int P=1e9; int a[15][15],f[15],h[5010],dp[15][5010],ans; int main(){ int n,m;原创 2021-05-20 14:57:31 · 146 阅读 · 0 评论 -
[NOIP2016 提高组] 愤怒的小鸟
[NOIP2016 提高组] 愤怒的小鸟 题意: 有n只猪,给出猪的坐标(xi,yi),问最少用几个形如 y=ax^2+bx 的曲线可以保证所有猪在曲线上,满足a<0,a,b为实数 n<=18, 题解: 两个方法:爆搜或者状压dp 状压dp 看n<=18也就能看出来,这数据范围就是用状压dp 我们用二进制来表示哪些猪已经被曲线标记,比如11(十进制),二进制下是000001011,表示第1,2,4头猪已经被标记 首先对于每个状态,我们用state[i]记录其第一次0出现的位置(从右往左),原创 2021-05-20 15:40:57 · 239 阅读 · 0 评论 -
B - A Funny Bipartite Graph
B - A Funny Bipartite Graph 题意: 一个二分图,左右各有n个点,左边第i个点有一个属性mi,它在一个图中的价值为midi,其中di为它在图中的度数(特殊的,如果度数为0,则价值为0),求一个该二分图的子图使得右边的每个点度数都不为0且总价值最小,输出最小价值。如果无解输出−1 有若干个限制条件(i,j)表示子图中左边的点i和j不能同时存在 保证: 原二分图中左边的每个点度数在[1,3]之间。 左边的i点和右边的j点连线当且仅当i ≤ j n<=18 mi<=100 题原创 2021-05-22 17:16:45 · 407 阅读 · 0 评论 -
P3959 [NOIP2017 提高组] 宝藏
P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说,就是n个点m个边,选定一个点为根节点,构造一个最小生成树,边的权值为该该边起点到根节点之间的点的数量K(不含根节点) * 道路长度 1<=n<=12 0<=m<=1e3 v<=5e5 题解: 参考题解 这数据范围?暴力暴力暴力 不,我们用状压dp来做 我们设dp[i][j]表示用到第i个元素,当前连接状态为j的花费的最小值 这个式子没办法直接转移,因为每个边的花费是不一样的,即k是不一样的,我们可以重新设计原创 2021-05-20 22:41:46 · 242 阅读 · 0 评论 -
P1896 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 题目: 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。 题解: 需要知道前一行的情况,所以一行一行的放车 记录每行的情况 在本题中,不能存在相邻的1 对于一行x: (x&(x<<1))==0----->可以判断左右是否有相邻的1 对于上一行x,下一行y: (x&y)= = 0 (x&(y<<1)) = =0 (原创 2021-01-31 13:46:14 · 642 阅读 · 2 评论 -
Doing Homework HDU - 1074
Doing Homework HDU - 1074 题意: 有n个任务,每个任务有一个截止时间,超过截止时间一天,要扣一个分。 求如何安排任务,使得扣的分数最少。 (1<=n<=15) 题解: n很小,可以往状压dp方向去想 我们用i枚举所有的状态,然后对于第j个任务,tmp=i-(1<<j),tmp表示状态i在未完成j的前一个状态 tim[]表示当前状态所花费的时间,那么完成第j个任务所扣分数为score=tim[tmp]+cost[j]-dead[j],完成tmp所需时间+完成任原创 2021-06-04 10:14:26 · 185 阅读 · 0 评论