状态压缩/状压DP
Love_xyh
这个作者很懒,什么都没留下…
展开
-
[HNOI2013]消毒
如果只有二维,那么我们建二分图求最大匹配,O(n^2)的复杂度可以实现。而现在是三维,发现不会三分图,好像也没有三分图这个算法…再思考一下对于二维,是否有别的暴力实现方法?我们可以暴力枚举哪些行是被消掉的,然后对于不是剩下的黑点,枚举每一列是否需要再消一次。复杂度:O(2^n*m)由于a * b * c<=5000,可得min(a,b,c)<=17,所以现在我们也可以暴力枚举每一层是否消掉,然后对于没有消掉的层,进行二分图求最大匹配,因为现在三维就变成二维的了。我们将最小的那一维作为立方原创 2020-09-12 18:49:57 · 148 阅读 · 0 评论 -
CF11D A Simple Task
考虑状压dp:f[u][p]表示当前点为u,状态为p的方案数,用记忆化搜索来实现。为了避免重复情况的出现,我们需要再枚举一个状态中的最小节点:在后来的所有进入环中的节点均需大于该状态的最小节点。由于一个环,可以正着走和倒着走,所以最后方案数要除以2。#include <bits/stdc++.h>#define int long longusing namespace std;const int N=19;int n,m,x,y,ans;int a[N][N],bin[N],f[原创 2020-08-06 15:44:48 · 195 阅读 · 0 评论 -
BZOJ 4006: [JLOI2015]管道连接
最小斯坦纳树森林可以这样理解题意:在一幅n个点,m条双向边的图中,有k个关键点,每个关键点有一个颜色。现在要求将一些边连起来,使得任意一种颜色的所有关键点相连。连接每条边的花费已给出,问最小花费为多少。分析:显然,此时的答案是由大于等于1棵最小斯坦纳树组成的最小斯坦纳树森林,答案<=一棵最小斯坦纳树的答案。设f[i][p]表示:当前位置为i,连接的关键点的位置为p的最小花费。(这一部...原创 2020-03-08 21:07:32 · 124 阅读 · 0 评论 -
最小斯坦纳树
之前把斯坦纳树的题目放在状压dp里,现在觉得还是应该新建一个专题。毕竟斯坦纳树的dp转移自成一套,和其他的状压dp转移有很大区别。#include <bits/stdc++.h>using namespace std;const int N=105,M=505,K=10;int n,m,k,u,v,w,x,max_statue,inf;int f[N][1<<K]...原创 2020-03-08 20:52:34 · 297 阅读 · 0 评论 -
CF327E Axis Walking
简单状压dp。难点:需要在状态的枚举过程中的通过位运算技巧进行优化。#include <bits/stdc++.h>#define lowbit(x) x&(-x)using namespace std;const int N=24,MOD=1e9+7;int n,k,max_statue;int a[N],b[3],sum[1<<N],f[1<...原创 2020-02-25 18:45:29 · 131 阅读 · 0 评论 -
CF417D Cunning Gena
一眼状压,且是个纯粹的状压。如果没有显示器台数限制的话,就成了最模板的状压dp,现在因为有了显示器台数的限制,我们可以枚举每一次能用的最多的显示器台数。考虑暴力进行求解:设f[p][j]为显示器台数最多为离散化后第j大,已选集合为p的最小花费。会得到一个O(n*2^m * n)的复杂度。signed main(){ scanf("%lld%lld%lld",&n,&m,&a...原创 2020-02-25 15:34:22 · 180 阅读 · 0 评论 -
洛谷 P4950 完美数字
之前的博客中提到过CF1073E,现在重新回顾一下这种类型的题目。均是求L-R的区间中符合类型的数的和,而不是求符合类型的数的数量。P4950 完美数字#include <bits/stdc++.h>#define int long longusing namespace std;const int N=10;int T,n,m,x,now,p1,p2;int a[N],...原创 2020-02-25 13:44:38 · 364 阅读 · 0 评论 -
洛谷 P4892 GodFly的寻宝之旅
题意有点绕,读懂题意之后就是一道简单计数状压dp。大致题意:给出一幅图,要求计算从起点开始走到终点的(在题目特殊规则下统计的)路径条数。根据题意,一条路径会被一个复杂的公式分成0路径和1路径两种,而题目则是要求到达终点的opt(opt为已给的0或1)路径有多少。(opt为输入数据)#include <bits/stdc++.h>#define int long longus...原创 2020-02-22 17:59:28 · 214 阅读 · 3 评论 -
洛谷 P3930 SAC E#1 - 一道大水题 Knight
#include <bits/stdc++.h>using namespace std;const int dx[8]={-1,-2,-2,-1,1,2,2,1},dy[8]={-2,-1,1,2,-2,-1,1,2};const int N=60;int n,cnt,sx,sy,tx,ty,max_statue;int mp[N][N];bool f[N][N][1&l...原创 2019-11-06 20:29:24 · 443 阅读 · 0 评论 -
LOJ #10172. 「一本通 5.4 练习 1」涂抹果酱
爆搜出三进制的状态,因为m<=5,所以状态最多为3*(2^5)=48个,然后就可以用一个二维dp来统计答案了。可以发现给出行上和给出行下的方案数是一样的,设给出行上的方案数为ans1,给出行下的方案数为ans2,答案即为 ans1*ans2。所以严格意义上不算是状压dp吧,没有用到二进制状压的精髓。#include <bits/stdc++.h>#define int l...原创 2020-01-02 20:11:11 · 205 阅读 · 0 评论 -
BZOJ 2595: [Wc2008]游览计划
斯坦纳树模板题,记录一下路径即可//斯坦纳树,解决这一类问题:给定一张图,并给出k个点,问利用边与其它点将这k个点连接起来的最小边权和为多少,k一般为10//一眼看状压dp,然后就想到了洛谷1171售货员的难题 好像与它差不多,看了下后天差地别,完全不一样 ,因为这题没有起点 // 开始想状态,想不出,看了很久的题解后,感觉还是懵懵的//转移过程有点树形dp的味道,有根、子树这样的概念,但...原创 2019-12-25 20:37:38 · 155 阅读 · 0 评论 -
CF453B Little Pony and Harmony Chest
题目大意:cf div1 B:简单分析一波即可。#include <bits/stdc++.h>using namespace std;const int N=105;int n,max_statue,ans,now;const int prime[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};//因为1<=a[...原创 2019-12-22 18:08:01 · 220 阅读 · 0 评论 -
BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛
状压dp入门题。写状压dp的时候,其实有很多小优化技巧,最方便的也是最没啥用的一个(不过也有点用,上次就有一次因为没优化被卡常),就是数组定义的时候尽量定义为0—n-1,这样的话就不用1<<(i-1)了,直接1<<i即可。如果把加了这个小优化的话,bzoj快20ms,洛谷快9ms。#include <bits/stdc++.h>#define int l...原创 2019-12-22 15:50:25 · 247 阅读 · 0 评论 -
洛谷 P3118 [USACO15JAN]电影移动Moovie Mooving
状压+卡常状态和转移应该算是挺简单的,在转移过程中二分枚举一下就可以了,不过这个复杂度貌似有点慌:(2^n*n *log2( c ))/2(除以2,是因为当新枚举的那个i不在状态p中才进行转移),再加一个max,和几个位运算,加减运算,感觉会超时,事实证明,确实超时了。可能是我不太会卡常的缘故,这里给一个卡过去的别的人博客。洛谷AC下面来考虑下,不卡常的做法。很多dp中,n^3 都可以优化...原创 2019-11-11 00:18:06 · 234 阅读 · 0 评论 -
洛谷 P3475 [POI2008]POD-Subdivision of Kingdom
把一张无向图分为两个点集,使得不同点集的点之间的边数最少,n<=26。n<=26,所以,可以爆搜,然后用二进制表示某个点是在第一个点集还是在第二个点集。初始化所有点都在点集S2中,然后在爆搜的过程中不断更新最小值。那么,下面就可以得到一个爆搜程序#include <bits/stdc++.h>#define lowbit(x) x&(-x)using na...原创 2019-11-03 11:15:03 · 234 阅读 · 0 评论 -
洛谷 P4996 咕咕咕
个人觉得此题确实不错,且个档部分分都值得一写。40pts:状压爆搜#include <bits/stdc++.h>#define int long longusing namespace std;const int N=21,MOD=998244353;int n,m,x,ans;int c[1<<N];char s[N];void dfs(int p,...原创 2019-10-31 19:53:52 · 211 阅读 · 0 评论