状压dp
SC.ldxcaicai
我很菜=_=
展开
-
2018.07.18 洛谷P1171 售货员的难题(状压dp)
传送门 感觉是一道经典的状压dp,随便写了一发卡了卡常数开了个O(2)O(2)O(2)优化水过。。。 我直接用dp[i][j]dp[i][j]dp[i][j]表示当前在第i个点,现在点的选取状况是j(二进制表示状态)。 这样的话直接位运算枚举出可以前去的点,然后转移状态。边界是所有点都被取过一遍。 代码如下:#include<bits/stdc++.h>using n...原创 2018-07-18 23:32:51 · 330 阅读 · 0 评论 -
2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)
传送门看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化。我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵。然后用快速幂转移。代码:#include<bits/stdc++.h>#define mod 1000000007#define N 128#define ll long long...原创 2018-09-28 16:56:48 · 208 阅读 · 0 评论 -
2018.10.25 bzoj4565: [Haoi2016]字符合并(区间dp+状压)
传送门当看到那个k≤8k\le 8k≤8的时候就知道需要状压了。状态定义:f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]处理完之后的状态为kkk时的最大贡献。由于每次合并会减少K−1K-1K−1个,因此0&lt;k≤K−10&lt;k\le K-10<k≤K−1。然后转移的时候不用一个一个转移。两次转移的断点的距离...原创 2018-10-25 07:52:53 · 152 阅读 · 0 评论 -
2018.10.24 bzoj2064: 分裂(状压dp)
传送门状压dp好题。考虑对于两个给出的集合。如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2。如果有呢?那么对于没有的就是子问题了。因此我们要最大化这样的子集数。这就需要状压dp了。我们把两个集合拼成一个,然后第二个集合合并进去的时候权值取负的,这样如果某个子集元素和为0表示该子集和满足要求。然后枚举一下之前的状态来...原创 2018-10-24 21:50:54 · 146 阅读 · 0 评论 -
2018.10.24 bzoj3195: [Jxoi2012]奇怪的道路(状压dp)
传送门f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个点连了jjj条边,第i−K+1i-K+1i−K+1~iii个点连边数的奇偶性为kkk时的方案数。转移规定只能从后向前连边。然后讨论奇偶性转移就行了。注意从f[i−1]f[i-1]f[i−1]转移过来的时候不用考虑最前面一位。然后再用f[i][j]f[i][j]f[i][j]转移f[i][j+1]f[i][j+...原创 2018-10-24 21:55:07 · 134 阅读 · 0 评论 -
2018.10.27 洛谷P2915奶牛混合起来Mixed Up Cows(状压dp)
传送门状压dp入门题。按照题意建一个图。要求的就是合法的链的总数。直接f[i][j]f[i][j]f[i][j]表示当前状态为jjj,下一位要跟iii连起来的方案数。然后从没被选并且跟iii连通的点转移就行了。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=...原创 2018-10-27 20:24:28 · 127 阅读 · 0 评论 -
2018.11.06 bzoj1097: [POI2007]旅游景点atr(最短路+状压dp)
传送门预处理出不能在每个点停留之后才停留的点的状态。对kkk个点都跑一次最短路存下来之后只需要简单状压一下就能过了吐槽原题空间64MB蒟蒻无能为力然后用fillfillfill赋极大值的时候当memsetmemsetmemset用赋成了很小的值导致挑了一个晚上都不知道哪里错了。于是f[i][j]f[i][j]f[i][j]表示现在停留在iii这个点并且已经停留过的状态为jjj,随便转移一波...原创 2018-11-06 11:53:56 · 158 阅读 · 0 评论 -
2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)
传送门状压一眼题。直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数。然后考虑现在怎么转移。显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n22n)由于这个集合里面的所有点最终都会被消掉,因此顺序并不重要。于是可以强制这一步会消掉lowbit(i)lowbit(i)lowbit(i)那么当前有两个选择:只消掉lowbit(i)l...原创 2018-11-02 23:16:18 · 112 阅读 · 0 评论 -
bzoj2560: 串珠子(状压dp+简单容斥)
传送门题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和。思路:fif_ifi表示保证集合iii中所有点都连通其余点随意的方案数。gig_igi表示只考虑集合iii中所有点的状态的子图的权值和。我们先预处理出ggg数组,然后考虑递推fff数组。显然fif_ifi是等于gig_igi扣掉一些东西的,扣掉的应该就是不连通的情况...原创 2019-02-09 12:23:43 · 298 阅读 · 0 评论 -
洛谷 P4784 [BalticOI 2016 Day2]城市(斯坦纳树)
传送门题意:给一个nnn个点mmm条边的带权无向图,让你构造一棵最小生成树使得kkk个关键点都在上面n≤1e5,m≤2e5,k≤5n\le1e5,m\le2e5,k\le5n≤1e5,m≤2e5,k≤5。思路:套上斯坦纳树板子:fi,jf_{i,j}fi,j表示iii为根子树特殊点状态为jjj的最优值,然后分情况转移即可。枚举jjj子集枚举不同的根第二种式子写出来就是最短路的...原创 2019-03-30 21:58:12 · 195 阅读 · 0 评论 -
2018.09.22 牧场的安排(状压dp)
描述农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个 格子。他想在那里的一些格子中种植美味的玉米。遗憾的是,有些格子区域的土地是贫瘠的, 不能耕种。 精明的 FJ 知道奶牛们进食时不喜欢和别的牛相邻,所以一旦在一个格子中种植玉米,那么 他就不会在相邻的格子中种植,即没有两个被选中的格子拥有公共边。他还没有最终确...原创 2018-09-22 23:40:03 · 501 阅读 · 0 评论 -
2018.10.05 bzoj1801: [Ahoi2009]chess 中国象棋(状压dp)
传送门dp好题。定义状态f(i,j,k)f(i,j,k)f(i,j,k)表示前i行,有j行放一个棋子,k行放两个棋子。然后分当前放0/1/20/1/20/1/2个棋子转移。代码:#include<bits/stdc++.h>#define mod 9999973#define ll long longusing namespace std;int n,m;ll f[...原创 2018-10-05 19:18:56 · 142 阅读 · 0 评论 -
2018.08.19 NOIP模拟 dp(二分+状压dp)
Dp题目背景SOURCE:NOIP2015-SHY-10题目描述一块土地有 n 个连续的部分,用 H[1],H[2],…,H[n] 表示每个部分的最初高度。有 n 种泥土可用,他们都能覆盖连续的 k 个部分,第 i 种泥土的价格为 C[i],可以使 i,i+1,…,i+k-1 部分的高度增加 E[i](如果 i+k&amp;amp;amp;gt;n,那就覆盖 i,…,n ),我们必须满足以下条件:...原创 2018-10-11 23:21:15 · 214 阅读 · 0 评论 -
2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
【描述】小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放。他希望连续看 L 分钟的电影。因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他不希望重复看一部电影,所以每部电影他最多看一次,也不能在看一部电影的时候,换到另一个正在播放一样电影的放映厅。 请你帮助小石头让他重 0 到 L 连续不断的看电影,如果可以的话,计算出最少看几 ...原创 2018-10-11 23:31:08 · 236 阅读 · 0 评论 -
2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233。 假设n=∏iakiin=∏iaikin=\prod _i a_i^{k_i} 那么集合中合法的数一定满足: t=∏i(1/akii)t=∏i(1/aiki)t=\prod _i (1/a_i^{k_i}) 发现后面的i很小,可以状压dp一发。 然后就没了。 注意集合中有1时需要把答案乘二。 代码:#include&amp;amp;lt;b...原创 2018-10-11 23:35:50 · 129 阅读 · 0 评论 -
2018.09.08 poj1185 炮兵阵地(状压dp)
传送门 状压dp经典题。 我们把每一行的状态压成01串。 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了。 注意当前行转移要考虑前两行的状态。 还要注意只有一行的情况。 代码:#include<iostream>#include<cctype>#include<cstdio>using namespace std;...原创 2018-09-08 21:56:16 · 121 阅读 · 0 评论 -
2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)
传送门 状压dp好题啊。 可以发现这道题的状压只用压缩5位。 f[i][j]表示当前在第i个位置状态为j的最优值。 显然可以由f[i-1]更新过来。 因此只用预处理在第i个位置状态为j时有多少个小朋友高兴就行了。 代码:#include<bits/stdc++.h>#define N 50005using namespace std;int n,c,f[N][...原创 2018-09-08 23:58:41 · 249 阅读 · 0 评论 -
2018.09.10 loj#10172. 涂抹果酱(状压dp)
传送门 三进制状压感觉有点难写啊。 不过这题状态转移方程挺简单的。 就直接f[i][j]表示前i行第i行状态为j时的选法总数,分情况转移就行了。 代码:#include<bits/stdc++.h>#define ll long long#define mod 1000000#define N 10005using namespace std;int n,m,...原创 2018-09-10 20:52:45 · 702 阅读 · 1 评论 -
2018.09.23 bzoj1076: [SCOI2008]奖励关(期望+状压dp)
传送门一道神奇的期望状压dp。用f[i][j]f[i][j]f[i][j]表示目前在第i轮已选取物品状态为j,从现在到第k轮能得到的最大贡献。如果我们从前向后推有可能会遇到不合法的情况。所以我们从后向前推。这时怎么处理不合法的情况呢?如果当前这个状态不具备选择k的条件。那么说明第i+1轮可能具备。于是f[i][j]+=f[i+1][j]f[i][j]+=f[i+1][j]f[i][...原创 2018-09-23 20:15:21 · 140 阅读 · 0 评论 -
2018.10.01 NOIP模拟 偷书(状压dp)
描述在L的书架上,有N本精彩绝伦的书籍,每本书价值不菲。M是一个书籍爱好者,他对L的书籍早就垂涎三尺。最后他忍受不了诱惑,觉得去偷L的书,为了迅速完成这件事,同时他不希望L很快发现书籍少了,他决定偷书时,对于任意连续的k本书,他最多选B本,最少选A本。现在他想知道怎么选出来的书本最后使得偷的书籍的价值和,与剩下的书籍价值和,差值最大。输入第一行四个整数 n,k,a,b一行 N 个整数表示...原创 2018-10-11 23:39:30 · 431 阅读 · 0 评论 -
2018.10.05 NOIP模拟 上升序列(状压dp)
描述给出一个长度为 m 的上升序列 A(1 ≤ A[i]≤ n), 请你求出有多少种 1…n 的排列, 满足 A 是它的一个 LIS.输入第一行两个整数 n,m.接下来一行 m 个整数, 表示 A.输出一行一个整数表示答案.样例【输入样例1】5 31 3 4【输出样例1】11【输入样例2】4 23 4【输出样例2】5提示【数据范围与约定】对于前 30% 的数...原创 2018-10-11 23:46:05 · 255 阅读 · 0 评论 -
bzoj5019: [Snoi2017]遗失的答案(状压dp+fmt)
传送门跟这道题的想法基本一样吧。只不过这道题是求出所有可能选出的数拿来做状压dpdpdp求出总方案。然后维护一下前后缀的dpdpdp值,用fmtfmtfmt合并prei−1pre_{i-1}prei−1和sufi+1suf_{i+1}sufi+1来得到缺失第iii个可行值的方案数。代码:#include<bits/stdc++.h>#include<tr1/uno...原创 2019-08-14 23:00:27 · 181 阅读 · 0 评论