状压dp
小菜鸡加油
菜鸡
什么都能折磨
展开
-
hdu3247 Resource Archiver(AC自动机上bfs预处理+dfs/状压dp解tsp问题)
http://acm.hdu.edu.cn/showproblem.php?pid=3247把所有的串挂到自动机上去,这样就能在自动机上跑最短路由于最短路长度为1所以改成bfs标记病毒串不能bfs经过这样就变成10个串,预处理出根到每个串结尾的距离,就是先构造出哪个串然后再从这个串开始跑其他串,只要状态把全部串都跑到即可(类似tsp,不过tsp最后要回来再花代价)由于给了10sdfs也能接受就暴力跑了2s过(发现自己的自动机之前的没有trie图却过了hdu板子题,甚至这道题我对拍了网上其他原创 2021-11-09 21:42:28 · 177 阅读 · 0 评论 -
C. Square Subsets(状压dp+组合数学/线性基)
https://codeforces.com/problemset/problem/895/C线性基待补。思路:将质因子状态集合状压,0表示此时次数为偶数,1表示次数次数为奇数。对于当前s,奇数时候其分解的质因子要和s异或得之前的状态。偶数直接沿用。对于某个数字出现的次数k,我们考虑取C(1,K)+C(3,K)+----=2^(K-1).偶数同理。最后注意,卡时间,预处理幂次。卡空间。改成滚动。#include<iostream>#include<v..原创 2021-05-26 15:54:33 · 211 阅读 · 0 评论 -
D. Roman and Numbers(状压dp+前导零)
https://codeforces.com/problemset/problem/401/D思路:看到这个18开始往数位dp搞了。但是是个状压。定义dp[s][j]:当前取数状态为s,且modm=j的方案数。对于排列,我们考虑其枚举s中的一个数,然后从之前状态转移,且枚举到的这个数放在最后一个位置加进去。这样第二部分的mod就可以顺推,前一个状态为k,现在加入某个数的状态可以算出。之前的数为X,X=km+j;选择了w[i]之后,X=10km+10j+w[i]; 余数就变成了:(10j+w[原创 2021-05-26 01:24:35 · 132 阅读 · 0 评论 -
B. Little Pony and Harmony Chest(状压dp+数论)
https://codeforces.com/problemset/problem/453/B思路:题意要求b序列中两两互质,也就是说b序列中每个数的质因子分解不能有相同。而ai<=30,若b取到59时,|1-30|=|30-59|=29,其实bi最大范围在59就可以满足要求了,而这里面所有数质因子分解最多16个。所以状压考虑这个质因子集合出现的状态。然后最后记录前驱输出方案数。#include<iostream>#include<vector>#includ原创 2021-05-20 21:24:45 · 213 阅读 · 0 评论 -
P3959 [NOIP2017 提高组] 宝藏(状压dp生成树)
https://www.luogu.com.cn/problem/P3959参考:https://www.luogu.com.cn/blog/_post/63404https://www.luogu.com.cn/blog/_post/65659日后接着搞....从1开始就是样例不过..#include<iostream>#include<vector>#include<queue>#include<cstring>#incl原创 2021-05-08 21:55:49 · 316 阅读 · 0 评论 -
P2831 愤怒的小鸟(状压dp)
https://www.luogu.com.cn/problem/P2831#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>#define.原创 2021-05-05 13:23:06 · 125 阅读 · 1 评论 -
AtCoder Beginner Contest 187F Close Group(状压dp)
https://atcoder.jp/contests/abc187/tasks/abc187_f思路:预处理完全图的思路就是先把每个点的可达集合都求出来,然后枚举每一个状态,找到该状态的一个点,判这个点的状态集是否包含了这个枚举的状态。即枚举的状态是这个点状态集的子集。然后就可以状压dp了注意位运算多加括号#include<iostream>#include<vector>#include<queue>#include<cstring&原创 2021-05-05 10:41:39 · 209 阅读 · 2 评论 -
Valley Numer II(状压dp)
http://acm.hdu.edu.cn/showproblem.php?pid=6149思路:将图的相关点变成序列。对于每个点,搜出匹配的山峰状态s。采用递推,i的s状态,搜出两个没用过的点,更新dp[i+1][s|1<<(p-1)|1<<(q-1)],类似01背包,看是否能在现在的基础上+1#include<iostream>#include<vector>#include<queue>#include<cstr原创 2021-05-04 22:50:30 · 107 阅读 · 0 评论 -
Pieces(状压dp枚举子集)
http://acm.hdu.edu.cn/showproblem.php?pid=4628思路:dp[i]表示当前i这个状态,然后枚举其子集,看是否是回文,回文即可更新。然而暴力的话是4^n。集合的完全子集复杂度是3^n#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#inc原创 2021-05-04 20:23:33 · 160 阅读 · 0 评论 -
CodeForces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(思维+dsu on tree+前缀异或)
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths大概是dsu on tree的最难题了吧...还是存在有些地方没有想通。暂时先存下来。讲的比较详细的思路:这里Soution: 注意到字母最大是v,即最多有22种字符,看到这个数据范围就想到利用状压。那么在这题怎么用上状压呢?想到一个性质:一个简单路径可以通过打乱变成回文串,当且仅当在这个路径上出现的次数为奇数的字符个数不超过一个。 我们状压记录每个字符出现的奇偶原创 2020-12-03 22:13:16 · 641 阅读 · 0 评论 -
214. Devu和鲜花(组合数学+容斥+mod细节)
https://www.acwing.com/problem/content/description/216/思路:先转化成求解不定方程的非负整数解个数。其解法和寒假牛客的那道m个球取不重复的n个构成递减是一样的。将其每个加一个后变成了m+n-1个空中插入n-1个挡板的方案数问题。然后对于每一个情况取反,最后用状压表示容斥状态。细节:单算组合数mod的时候,上面*i还是可能炸LL,所以*(i%mod)%mod.或者下面传参的时候把m%mod后再传。#include<iostrea原创 2021-03-24 11:35:39 · 135 阅读 · 0 评论 -
涛酱和策策的游戏again(by良心出题人wzc)(思维+状压dp)
https://ac.nowcoder.com/acm/contest/12482/D题意:https://blog.csdn.net/zstuyyyyccccbbbb/article/details/115171072在原题的基础上进行了限制一些点不可放置。思路:对这些不可放置的结合到预处理的st[]中去。这里需要将st[][]开成二维,记录第i列,j状态的可行性。细节:1.将不可存放转化成二进制数累加(记为temp),遍历所有进行【状态&temp】,如果==1即说明包含了不.原创 2021-03-24 16:45:17 · 139 阅读 · 0 评论 -
2021牛客寒假算法基础集训营5 树上博弈(结合博弈状态的dp+有关树的状压dp)
思路:参考文章:https://blog.nowcoder.net/959548301qwq看到n≤20考虑状压dp。dp[s]表示当前点集为s,先手比后手高多少分。如果此时里面只有一个点的话,显然答案就是那个点的权值。否则的话枚举下一步操作是什么,假设选的点是i,dp[s∪{i}]的状态就可以由dp[s]来更新。就是一个顺推的dp思路,当前的s可以更新哪些状态。然后转移的权值是a[i]−dp[s]。这里就是博弈类型dp的一个思路。因为先手得到了ai,之后后手的...原创 2021-02-25 17:16:20 · 146 阅读 · 0 评论 -
D. Minimax Problem(二分+状压枚举子集)
https://codeforces.com/contest/1288/problem/D参考lc哥:https://blog.csdn.net/qq_45458915/article/details/104012920#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#in原创 2021-04-18 18:50:33 · 89 阅读 · 0 评论 -
291. 蒙德里安的梦想(思维+状压dp)
https://www.acwing.com/problem/content/description/293/思路:一个很重要的点就是放好合法的横块之后,竖块的摆放就确定了。于是枚举每一列的状态,用二进制表示。j为上一列的状态,k为此列的状态。可以知道,j&k==0 并且j|k的每段连续0的个数是偶数是符合的。于是j|k的每段连续0的个数是偶数的符合的状态在每一个列的状态是一致的。提前预处理就好。if( (j&k)==0 &&(st[j|k] )d原创 2021-03-24 12:21:50 · 258 阅读 · 0 评论 -
G. 2.小w的密室(状压bfs)
题意:小X 正困在一个密室里,他希望尽快逃出密室。密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间。密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条从房间X 到房间Y 的通道。另外,想要通过某个传送门,就必须具备一些种类的钥匙(每种钥匙都要有才能通过)。幸运的是,钥匙在打开传送门的封印后,并不会消失。然而,通过密室的传送门需要耗费大量的时间,因此,小X 希望通过尽可能少的传送门到达出口,你能告诉小X 这个数值吗?另外,小X 有可能不能逃出这个密室,如原创 2021-01-31 14:45:11 · 142 阅读 · 1 评论 -
Doing Homework hdu1074(状压dp)
Description马上假期就要结束了,zjm还有 n 个作业,完成某个作业需要一定的时间,而且每个作业有一个截止时间,若超过截止时间,一天就要扣一分。zjm想知道如何安排做作业,使得扣的分数最少。Tips: 如果开始做某个作业,就必须把这个作业做完了,才能做下一个作业。Input有多组测试数据。第一行一个整数表示测试数据的组数第一行一个整数 n(1<=n<=15)接下来n行,每行一个字符串(长度不超过100) S 表示任务的名称和两个整数 D 和 C,分别表示任务的截止时原创 2020-11-10 20:28:29 · 124 阅读 · 0 评论 -
机器人(状压dp/贪心)
https://ac.nowcoder.com/acm/contest/9986/G思路:范围很小,爆搜超时,于是状压dp。当然如果范围大了是个贪心的操作#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstd原创 2021-02-28 12:32:18 · 154 阅读 · 0 评论 -
D. 505(状压dp)
https://codeforces.com/problemset/problem/1391/D思路:我记得这个题我似乎去年碰到了。当时看了一眼就扔了。今年给补上了。这个题有个结论。就是n>=4&&m>=4的时候是-1的。所以不用存图。能找到的最小的子矩阵应该是2 * 2 ,如果一个2 * 2矩阵内含有奇数个1,那么四个2 * 2矩阵拼接形成一个4 * 4矩阵中肯定就含有偶数个1,所以如果n和m同时大于等于4,那么一定无法构造出符合题意的矩阵.那么手动模拟一下可以原创 2021-04-30 20:47:40 · 211 阅读 · 2 评论 -
CCA的区间(思维+状压/sosdp)
https://ac.nowcoder.com/acm/contest/11168/E思路:可以反转一个区间代表着可以将任意两个连续的区间拼接在一起于是问题就变成了选两个不相交的最大子区间的和最大是多少。考虑到值是log级别的,转化到值上去。把一个合法区间的状态看成二进制,进行状压。由于指数级别,所以最多第二个for最多跑24次就结束了。于是可以nlogn处理出序列里所有的二进制数。问题就变成了求两个数x,y, x&y==0的条件下x^y的最大值。于是预处理每个二进制状.原创 2021-03-24 20:13:42 · 154 阅读 · 0 评论