![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
状态压缩
Mys_C_K
人生有许多道:曾经踏足的是道,即将踏往的也是道,那什么才是道呢?唯有脚下走的才是道。一切精神或者物质都归于虚无,然后从混沌中衍生出三万道。在悲喜间涉足一条无数前人经历过,且将有无数后人奔赴的道,无论是否已经或者将要到达彼岸,然后便不再回头或是左顾右盼,即使有些道繁盛至极,夜灯如昼,无数人一浪又一浪的涌去,造就了世人皆知的辉煌;即使有些道草木凋敝,荒草丛生,只等勇敢的开拓者斩开荆棘,创造一片天地;这些都无所关,无所在意,彼岸何如、来日何方甚至过往旧事都化作一缕云烟,飘渺碧霄,我自撷高山之月色,独随足落处往行。
展开
-
[SCOI2005] BZOJ 1088 扫雷-状压dp
传送门题目大意:略。题解:大佬们好多花式做法。一开始想的直接递推发现推不出来。(后来看了网上一个人的题解发现可以直接递推)想了想发现推不出来的原因是,一方面第二列的第i行对第一列的第i+1行有影响要记录,而且不记录“轮廓”的话会有重复计数。注意到一个格子周围的“轮廓”长度是3,因为再大就影响不了了,因此可以状压dp,这样就可以保证不会有重复了。以上是我的做法。原创 2017-06-16 20:23:44 · 498 阅读 · 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 · 232 阅读 · 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 · 257 阅读 · 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 · 206 阅读 · 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 · 276 阅读 · 0 评论 -
CF 221 C Circling Round Treasures - dp - 状压
题目大意:给你一张网个图,每个位置是空地、障碍、炸弹、宝藏、起点之一。规划一条从其点出发不包含炸弹的闭合路线(回路),并可获得最大的利润。利润定义为路线内部的宝藏收益(可能为负数)之和减去路径长度(可以不走)。注意路线可以自交。为了确定一个格子是否在这条路线里面,请使用以下算法判断:1.假设该点的坐标为需要判断的点为 p(i,j) ,该点不在路线上。2.从该点往任意方向作一条射线,如果与路...原创 2018-10-04 11:45:52 · 223 阅读 · 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 1000000007using namespace std;inli原创 2018-08-06 12:35:18 · 529 阅读 · 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 · 226 阅读 · 0 评论 -
NOIP2017 luogu 3959 宝藏 - 状压dp
按照一层一层的加叶子的方式转移即可#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>#include<climits&原创 2018-06-25 10:25:45 · 312 阅读 · 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 1000000007using namespace std;inli原创 2018-02-05 15:38:00 · 634 阅读 · 0 评论 -
[SCOI2007] BZOJ 1072 排列perm - 状压dp
传送门题解:dp数组记录当前数字和%d以及用了哪些数字#include#include#include#define N 11#define D 1010using 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 · 355 阅读 · 0 评论 -
BZOJ 1688 Disease Manangement 疾病管理 -状压dp
传送门题解:傻逼题#include#include#include#include#include#define inf (INT_MIN/2)#define N 1010#define D 16using namespace std;inline int getv(int x,int p){ return (x&(1>(p-1);}inline i原创 2017-08-26 19:50:07 · 551 阅读 · 0 评论 -
BZOJ 1231 mixup2 混乱的奶牛 - 状压dp
传送门题解:傻逼题#include#include#include#include#define lint long long#define N 17using 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 · 338 阅读 · 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 · 343 阅读 · 0 评论 -
BZOJ1725 Corn Fields牧场的安排 - 状压dp
传送门题解:傻逼题#include#include#include#include#define N 13#define MAXT 380#define mod 100000000using 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 · 336 阅读 · 0 评论