状态压缩
Mys_C_K
人生有许多道:曾经踏足的是道,即将踏往的也是道,那什么才是道呢?唯有脚下走的才是道。一切精神或者物质都归于虚无,然后从混沌中衍生出三万道。在悲喜间涉足一条无数前人经历过,且将有无数后人奔赴的道,无论是否已经或者将要到达彼岸,然后便不再回头或是左顾右盼,即使有些道繁盛至极,夜灯如昼,无数人一浪又一浪的涌去,造就了世人皆知的辉煌;即使有些道草木凋敝,荒草丛生,只等勇敢的开拓者斩开荆棘,创造一片天地;这些都无所关,无所在意,彼岸何如、来日何方甚至过往旧事都化作一缕云烟,飘渺碧霄,我自撷高山之月色,独随足落处往行。
展开
-
[SCOI2005] BZOJ 1088 扫雷-状压dp
传送门 题目大意:略。 题解: 大佬们好多花式做法。 一开始想的直接递推发现推不出来。 (后来看了网上一个人的题解发现可以直接递推) 想了想发现推不出来的原因是,一方面第二列的第i行对第一列的第i+1行有影响要记录, 而且不记录“轮廓”的话会有重复计数。 注意到一个格子周围的“轮廓”长度是3,因为再大就影响不了了,因此可以状压dp,这样就可以保证不会有重复了。 以上是我的做法。原创 2017-06-16 20:23:44 · 500 阅读 · 0 评论 -
六 - 搜索 - dp
题目大意:给你一个正整数NNN,为有多少非空序列{An}\{A_n\}{An}满足: ∀ i∈[1,n], Ai∣N∀ i∈[1,n], (∑j=1i−1[gcd(Ai,Aj)>1])≤1\forall\ i\in[1,n],\ A_i|N\\ \forall\ i\in[1,n],\ \ \left(\sum_{j=1}^{i...原创 2018-12-20 20:37:20 · 234 阅读 · 0 评论 -
管道 - dp - 状压
题目大意:给你一张无向图求合法的dfs序数量。dfs序不能在还可以dfs的时候退出。n≤18n\le18n≤18。 题解: 设dp(S,x)表示,已经遍历了S(包括x),现在在x,然后接下来要从x出发遍历一个极大的集合的方案数(注意不是全集)。 首先如果不存在y使得g(x,y)=1g(x,y)=1g(x,y)=1且{y}∉S\{y\}\notin S{y}∈/S,那么dp(S,x)=1并退出。 ...原创 2018-11-05 12:37:24 · 259 阅读 · 0 评论 -
AGC 012 E Camel and Oases - 状压dp
题目大意:数轴上有n个不同的点,你有一个能量,初始是v。可以进行两种操作,走到左边/右边一个点,如果当前能量大于等于距离。或者随意跳到一个点,但是要求能量不是0并且能量要减半(向下取整)。对每个点求从这个点出发能否到达所有点。一个点可以经过多次。n,v≤2×105,∣xi∣≤109n,v\le2\times10^5,|x_i|\le10^9n,v≤2×105,∣xi∣≤109 题解: 首先v只会...原创 2018-10-17 14:41:24 · 207 阅读 · 0 评论 -
bzoj 4676 Xor-Mul棋盘 - 状压
……每一位独立,直接朴素dp即可。 (可以类似插头dp一样逐格转移优化掉一个2n2^n2n但是懒的写了) #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) #define lint long long #define ull unsigned lint #define gc getchar() #de...原创 2018-10-09 12:24:02 · 278 阅读 · 0 评论 -
CF 221 C Circling Round Treasures - dp - 状压
题目大意: 给你一张网个图,每个位置是空地、障碍、炸弹、宝藏、起点之一。 规划一条从其点出发不包含炸弹的闭合路线(回路),并可获得最大的利润。 利润定义为路线内部的宝藏收益(可能为负数)之和减去路径长度(可以不走)。注意路线可以自交。 为了确定一个格子是否在这条路线里面,请使用以下算法判断:1.假设该点的坐标为需要判断的点为 p(i,j) ,该点不在路线上。2.从该点往任意方向作一条射线,如果与路...原创 2018-10-04 11:45:52 · 228 阅读 · 0 评论 -
Atcoder Regular 058 E - 和風いろはちゃん / Iroha and Haiku - 状压
题目大意:问有多少长度为N的数列{aN},满足每个数字权值在[1,10]中,并且不存在1 #include #include #include #define lint long long #define LOG 17 #define maxK 10 #define V 1 #define N 42 #define mod 1000000007 using namespace std; inli原创 2018-08-06 12:35:18 · 544 阅读 · 0 评论 -
bzoj 2064 分裂 - 状压dp
考虑n=m并且两两数字对应相等的时候答案是0 那么如果我们能把两组数字每一组都划分成k组使得这k组对应相等的话那么答案就可以省去2k 如果有一组内部黑可以继续划分那么答案可以继续减少2 因此问题转化为求最大的k 朴素的做法是3的2n次,加上一些剪枝即可 但其实我们令dp[s][t]在s集合的和不等于t集合的和的时候也有意义,只在sum(s)=sum(t)的时候dp++即可。 这样可能会...原创 2018-06-25 11:23:45 · 227 阅读 · 0 评论 -
NOIP2017 luogu 3959 宝藏 - 状压dp
按照一层一层的加叶子的方式转移即可 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #include<climits&原创 2018-06-25 10:25:45 · 314 阅读 · 0 评论 -
Atcoder Regular 058 E - 和風いろはちゃん / Iroha and Haiku - 状压
题目大意:问有多少长度为N的数列{aN},满足每个数字权值在[1,10]中,并且不存在1 #include #include #include #define lint long long #define LOG 17 #define maxK 10 #define V 1 #define N 42 #define mod 1000000007 using namespace std; inli原创 2018-02-05 15:38:00 · 636 阅读 · 0 评论 -
[SCOI2007] BZOJ 1072 排列perm - 状压dp
传送门 题解:dp数组记录当前数字和%d以及用了哪些数字 #include #include #include #define N 11 #define D 1010 using namespace std; int fac[10],b[10];char s[N]; int dp[1<<N][D],a[N]; inline int toi(char ch) { return ch^'0原创 2017-08-26 19:52:46 · 357 阅读 · 0 评论 -
BZOJ 1688 Disease Manangement 疾病管理 -状压dp
传送门 题解:傻逼题 #include #include #include #include #include #define inf (INT_MIN/2) #define N 1010 #define D 16 using namespace std; inline int getv(int x,int p) { return (x&(1>(p-1); } inline i原创 2017-08-26 19:50:07 · 553 阅读 · 0 评论 -
BZOJ 1231 mixup2 混乱的奶牛 - 状压dp
传送门 题解:傻逼题 #include #include #include #include #define lint long long #define N 17 using namespace std; int n,all,a[N]; lint dp[1<<N][N]; inline int getv(int x,int p) { return (x&(1>(p-1); } inl原创 2017-08-26 19:48:10 · 339 阅读 · 0 评论 -
[SCOI2005] BZOJ 1087 互不侵犯King - 状压dp
传送门 题解: 首先求出哪些行的状态是合法的,即没有相邻的棋子。 发现合法的行状态数量只有90,没有2^9=512这么多。 然后枚举相邻两行,预处理能否转移。 然后记q[i]表示第i种合法的行方案是q[i],cnt[i]表示q[i]放了多少个棋子 然后记dp[i][j][k]表示前i行第i行状态为j棋子个数是k的方案数 转移枚举哪些状态可以转移(刚才预处理过的) 然后……就没有然后原创 2017-08-26 19:41:32 · 344 阅读 · 0 评论 -
BZOJ1725 Corn Fields牧场的安排 - 状压dp
传送门 题解:傻逼题 #include #include #include #include #define N 13 #define MAXT 380 #define mod 100000000 using namespace std; inline int updv(int &x,int p) { return x|=(1<<(p-1)); } inline int getv(原创 2017-08-26 19:44:43 · 364 阅读 · 0 评论 -
[集训队作业2018]UOJ 422 小Z的礼物 - Min-Max容斥 - dp
题目大意:给你一个n*m的网格图,每个位置是0或者1,每次你可以选择一个1*2的子矩形涂黑。问期望多少次后所有1位置都被涂黑了?每次选择是独立的。n≤6,m≤100n\le6,m\le100n≤6,m≤100。 题解: 考虑Min-Max容斥,问题转为对每个1的子集T求第一次覆盖到T中某个1的概率,这个就是总方案数分之有多少方案至少一端在T中,用类似轮廓线的方法dp这个即可。(一开始写了直接状压的...原创 2019-02-26 10:56:32 · 342 阅读 · 0 评论