
状压dp
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj3812 主旋律(图论+状压dp+容斥原理)
题目给出一个 n 个点,m 条边的有向图,要求求出删掉一些边以后,整个图强联通的方案数,其中 n≤15,m≤n(n−1) 好难啊qaq 题解传送门:portal 实现上也有一些技巧要注意qaq#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#def...原创 2018-06-20 15:14:03 · 376 阅读 · 0 评论 -
bzoj1195 [HNOI2006]最短母串(ACAM+状压+bfs)
建出ACAM,然后装压到每个点的串匹配状态。 最短的字典序最小的,于是我们贪心地从小到大bfs。 复杂度O(nm2n)O(nm2n)O(nm2^n) 这题卡内存真是酸爽【再见】#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 6...原创 2018-05-28 14:46:27 · 305 阅读 · 0 评论 -
bzoj5336 [TJOI2018]party(ddp)
动态动态dp qaq 观察lcs的转移方程,我们发现f[i][j]与f[i][j+1]最多差1,于是可以差分掉状压。 复杂度O(n2m)O(n2m)O(n2^m)#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define ll long lo...原创 2018-05-21 23:26:01 · 375 阅读 · 0 评论 -
bzoj4000 [TJOI2015]棋盘(状压dp+矩阵快速幂)
题目中的标号都是从0开始的!所以攻击模板中你的位置为中间那一行!所以可以只考虑相邻两行的转移!先处理出f[s1][s2]表示相邻两行状态为s1,s2是否可行。 然后n很大,所以我们要矩阵加速。 复杂度O((2m)3logn)原创 2018-04-02 20:40:17 · 327 阅读 · 0 评论 -
bzoj1072 [SCOI2007]排列perm(状压dp+组合数学)
f[i][j]表示选了i状态的位置上的数,余数为j的方案数。 最后用排列组合的知识去一下重(除掉同一个数的顺序) 复杂度O(T∗2nm)O(T*2^nm)原创 2018-04-01 21:41:23 · 302 阅读 · 0 评论 -
bzoj5248 [2018多省省队联测]一双木棋(状压dp+hash表)
不难发现一个合法的状态可以用每一列有多少个棋子来表示。 状压一下就是11^10,可以用Hash表来存。可以注意到其实合法状态没有多少,可以先都搞出来存在队列里再倒着做。f[S]表示S状态的局面先手可以再得多少分,考虑转移,先手取最大,后手取最小。原创 2018-04-08 20:10:21 · 243 阅读 · 0 评论 -
bzoj3864 Hero meet devil(ddp)
这大概就是动态动态规划了吧qaq题意:给一个长度<=15的串S(仅包含ACGT),对于所有的i(0<=i<=|S|),求有多少长度为M的串T满足串T和串S的最长公共子序列长度为i。我们考虑普通的O(n^2)dp求lcs,f[i][j]表示LCS(S[1..i],T[1..j]) 我们有转移: f[i][j]=max(f[i][j−1],f[i−1][j],[S[i]==T[j]]∗(f[i−1]原创 2018-04-07 21:53:38 · 345 阅读 · 1 评论 -
bzoj5156 [Tjoi2014]拼图(状压+爆搜)
应该直接爆搜就可以了。我状压了一下每个位置目前是否被占据,跑得快了一些。不过这样输出路径时有点麻烦x 注意输出的,后面有空格。。。原创 2018-03-12 13:39:53 · 305 阅读 · 0 评论 -
CF453B Little Pony and Harmony Chest(数学+状压dp)
给定一个序列a,每个数不超过30,让你找出一个合法的序列b使得 ∑i=1n|ai−bi|\sum\limits_{i=1}^n|a_i-b_i|最小。 合法的序列b定义为b中的数两两互质。数列中的数两两互质这个要求怎么转化呢?其实就是要求每个质因数只能出现在一个数中。我们首先观察到b中的数最大为2*max{a}-1.(否则变成1肯定更优)所以b每个位置可填的数也就只有60种。可能的质因数只有17原创 2018-03-11 19:29:41 · 436 阅读 · 0 评论 -
luogu3959【noip2017】宝藏(状压dp)
首先处理出w[s1][s2]表示把s2的点都连到s1上的最小花费(s2中的每个点只能连到s1中的某个点上)。怎么处理呢?先O(2n∗n)O(2^n*n)做出单点到一个集合的花费,然后O(3n∗n)O(3^n*n)的处理出其他的集合到集合的花费。然后就可以dp了。 dp[i][S][s1]表示深度最大为i,已连接了S的点,最深层的点为s1的最小花费,我们枚举一个S的补集的子集s2来转移即可。 dp原创 2018-03-01 11:47:07 · 317 阅读 · 1 评论 -
bzoj2734 [HNOI2012]集合选数(数学+状压dp)
妙啊。 我们考虑搞出这样一张表:1 3 9 27 ...2 6 18 544 12 36 1088 24 72 216...相邻位置的数不能同时选即可,注意到最多只有11列,于是我们可以状压dp来计算方案数。我们注意到5,7…并没有出现在这张表中,于是记录已经算过的数,没算过的数就放在左上角生成这张表算一遍,把方案数乘起来即可。 复杂度大概O(n/lnnlog2n2lo...原创 2018-05-29 11:15:27 · 253 阅读 · 0 评论 -
ural1519 Formula 1(插头dp)
一个n*m的棋盘,有些格子是障碍,问存在多少条哈密顿回路。(n,m<=12) 基于连通性的状态压缩动态规划。cdq论文。 这题逐格递推,括号表示法,滚动数组+Hash表优化空间。 复杂度O(S∗n)O(S∗n)O(S*n) 2017.5.21第一次写这道题。 2018.6.13把这题整理到blog上。 这一年来,水平究竟有没有长进呢… 当时就能写出Hash表+括号表示法的插头d...原创 2018-06-13 15:22:37 · 314 阅读 · 0 评论 -
bzoj4455 [Zjoi2016]小星星(容斥原理+状压枚举+树形dp)
首先我们有一个树形状压dp的想法,f[x][i][S]表示x节点,匹配原图的i节点,子树匹配了原图S状态的点的方案数,这样可以保证一一对应,不重不漏,可惜复杂度高达O(n33n)O(n33n)O(n^33^n),无法承受。 我们考虑容斥,用树上n个点匹配原图n个点的所有方案-匹配原图n-1个点的所有方案+匹配原图n-2个点的所有方案-… 于是我们O(2n)O(2n)O(2^n)枚举原图的一个点...原创 2018-06-20 10:03:38 · 248 阅读 · 0 评论 -
bzoj4197 [Noi2015]寿司晚宴(数学+状压dp)
首先考虑n<=30怎么做,没几个质因子,状压掉 然后n<=100,状压着有点费劲,各种优化,比如*2>n的质因子肯定是贡献3倍答案,*3>n的质因子可以讨论一下也不压进状态里,然后就可以卡过去了 这启发了我们正解的思路!对于大质因子我们一起转移,然后就把这个大质因子这一位扔掉。 我们只需要状压<500−−−√500\sqrt {500}的那么8个质因子就好了。 ...原创 2018-06-25 13:26:42 · 216 阅读 · 0 评论 -
bzoj4145 [AMPPZ2014]The Prices(状压dp+背包)
dp[i][s],表示前i个商店,买了状态为S的物品的最小花费。 背包转移即可。 复杂度O(n2mm)O(n2mm)O(n2^mm)#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 110inline char gc(){ ...原创 2018-06-17 13:47:27 · 320 阅读 · 0 评论 -
bzoj5369 [Pkusc2018]最大前缀和(状压dp)
考虑对于一个序列,如果SpSpS_p是最大前缀和,那么对于p+1…n这个序列,需要满足任意前缀和均<=0.否则SpSpS_p一定不是最大前缀和。sum[s]表示s子集的点的权值和。 f[s],表示选了s的点,sum[s]为最大前缀和的方案数 g[s],表示选了s的点,所有前缀和均<=0的方案数 那么最后答案就是∑sum[s]∗f[s]∗g[s¯¯¯]∑sum[s]∗f[s]∗g...原创 2018-06-09 12:54:02 · 636 阅读 · 0 评论 -
bzoj3717 [PA2014]Pakowanie(状压dp+贪心)
贪心的把背包按容量从大到小排序,状压24个物品,S的物品放进去了需要最少几个背包f[S],以及此时最后一个背包的最大剩余容量g[S]。 复杂度O(n2n)O(n2n)O(n2^n)#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3finline char...原创 2018-06-15 08:37:57 · 275 阅读 · 0 评论 -
loj2540「PKUWC2018」随机算法(状压dp+组合数学)
设f[i][S]表示答案集合S大小为i,不可选的点的状态为S的方案数。 考虑在答案集合中再加入一个j来转移,本来还剩x个点可以选,选了j以后少了y个点可以选,那么这y个点可以随便放在排列的这x个位置之中,方案数为AyxAxyA_x^y。 复杂度O(2nn)O(2nn)O(2^nn)#include <bits/stdc++.h>using namespace std;#de...原创 2018-06-07 12:11:30 · 607 阅读 · 0 评论 -
bzoj2310 ParkII(插头dp)
类似bzoj1187 这回要求一条简单路的最大权值和。 简单路与简单回路的区别就在于,我们可以有独立插头。 于是多一维状态表示独立插头即可。 转移时多讨论一些情况就好了qaq 此时p=1,q=2的插头不管其实也是可以的,因为一条简单回路一定也能视作一条简单路,在其他情况被讨论到。 注意到我们这样无法考虑到只有一个点的简单路,于是乎单独处理掉。 复杂度O(nm4mm)O(nm4mm)O...原创 2018-06-13 18:51:36 · 354 阅读 · 0 评论 -
bzoj1187 [HNOI2007]神奇游乐园(插头dp)
在一个n*m的棋盘上,每个格子有权值,让你找一条简单回路使得经过的格子权值和最大。n<=100,m<=6 插头dp经典题目。复杂度O(nm3mm)O(nm3mm)O(nm3^mm)#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define ll long long#defi...原创 2018-06-13 16:27:09 · 394 阅读 · 0 评论 -
bzoj1076 [SCOI2008]奖励关(期望dp+状压dp)
期望dp就要倒着做。。。 dp[i][S],表示前i-1轮过后,目前的宝物获得状态是S,在i~k轮能获得的最大期望。那么答案就是dp[1][0]。原创 2018-01-30 14:34:08 · 368 阅读 · 0 评论 -
bzoj1097 [POI2007]旅游景点atr(spfa+状压dp)
首先spfa预处理一下K个点以及起终点之间的最小距离。 然后比较显然的状压dp。f[S][i]表示走过了状态为S的点,现在在i的最短路。枚举一个j去转移,判断一下合法就好了。复杂度看上去是O(km+2kk2)O(km+2^kk^2)的。原创 2018-01-25 22:43:56 · 337 阅读 · 0 评论 -
bzoj2073 [POI2004]PRZ(状压dp)
dp[s]表示S状态的人都干掉的最小时间,枚举子集来转移,复杂度O(n3)O(n^3)原创 2018-01-30 17:13:35 · 356 阅读 · 0 评论 -
NOIP模拟10.27
Poetize10 A.transport(Floyd+状压dp) 先Floyd预处理出两点间最短路径,然后状压dp,dp[s][i]表示状态为s的点都遍历了,停在i的最小时间。枚举一个j去转移就好了。然后处理出f[s],表示遍历了s状态的点的最小花费。然后枚举A遍历了哪些点,B必须遍历了其余点与1.取最大值就是最慢的,更新答案即可。复杂度O(2^n *n*n) B.elevator(数学+模原创 2017-10-27 16:18:17 · 392 阅读 · 0 评论 -
CF482C Game with Strings(期望dp+状压dp)
这题很神啊。orz sbw. 首先考虑一个数组num[s],表示问了s状态的问题,有几个串不能判断 。直接枚举状态处理的话会爆掉,因此思考优化。考虑两个串,什么状态会不能判断呢?当你询问的位置上的字母相同时。因此枚举两个串,相同的位置标1,把这个东西压成s.则询问的问题为s的子集时均不同区分这俩。从大到小递推的算出num[s]即可。有了这个数组我们就好dp了原创 2017-10-19 15:36:16 · 501 阅读 · 0 评论 -
CF678E Another Sith Tournament(概率dp+状压dp)
这题又想了会???一开始题都没读对orz。。其实就是让你安排一个比赛顺序,要求1最后存活的概率最大,求这个最大的概率。dp[s][i]表示状态s时擂主为i+1,最后1活下来的最大概率 。我们考虑倒着推(因为正着推难以统计答案x),则状态转移很显然:见代码。。。初始值给dp[1][0]=1,因为要求最后1存活下来。复杂度O(2^n*n^2)原创 2017-10-18 22:14:08 · 512 阅读 · 0 评论 -
CF16E Fish(概率dp+状压dp)
这题好像思路还是很简单的。。。概率推了一会。。。太弱了。。。原创 2017-10-18 17:21:15 · 579 阅读 · 0 评论 -
NOIP模拟9.23(TYVJ NOIP2017模拟赛D1)
T1 回形遍历T2 排列T3 近似排列计数原创 2017-09-27 11:23:40 · 746 阅读 · 0 评论 -
NOIP模拟9.17(TYVJ NOIP2017模拟赛D2)
TYVJ NOIP2017模拟赛D2T1 天天寄快递T2.天天和不可描述T3.罪犯分组原创 2017-09-18 11:42:25 · 644 阅读 · 0 评论 -
uoj265【2016提高】愤怒的小鸟(状压dp)
首先每两个点可以确定一条抛物线,一条抛物线可能打掉很多猪。所以我们先O(n2)O(n^2)预处理一下第i个点和第j个点所确定的抛物线(算个公式就好了),如果a<0才合法,(注意精度问题,还有特判横坐标相等的,小心除0)然后对于这条抛物线,如果合法的话,我们O(n)O(n)扫一遍,看有没有其他的点也在这条抛物线上。用b数组记录一下(n<=18,我们显然可以用二进制压缩状态,共2n2^n种,把这条抛物线原创 2017-08-14 22:50:19 · 348 阅读 · 0 评论 -
poj1038 Bugs Integrated, Inc.(3进制状压dp)
黑书1.5.2例题10 Bugs公司 一看m和n差这么多,才10,很有可能是状压。我们这样看好别扭。。把他转一下,变成n*m的矩形,那要压缩一定是把一行压成一个状态。考虑到放的小矩形是3*2或2*3的,会影响(i,x)能否放矩形的只有(i-1,x),(i-2,x)。所以我们用pre[x]这样表示: pre[x]=0->(i-2,x),(i-1,x)均空闲 pre[x]=1->(i-2,x)被占原创 2017-08-16 11:55:38 · 375 阅读 · 0 评论 -
bzoj1725 [USACO2006NOV]Corn Fields牧场的安排(状压dp)
跟上一题很像啊。。这题n=12,每行的状态也不太一样,所以我们就不预处理了。dp[i][k]表示第i行的状态为k的合法方案,等于第i-1行状态为j且j,k可以为相邻行的方案数的和原创 2017-08-16 10:44:48 · 467 阅读 · 0 评论 -
poj2411 Mondriaan's Dream(状压dp)
用1*2的小木块覆盖n*m的格子,问方案数。n,m<=10.状压dp,用二进制数表示一行的状态,逐行转移。横放用11表示,竖放用01表示。a[s]存的是上一行状态为s,能转移到的所有状态。初始值f[0][tot]=1,表示第0行全为1的方案有1个。最后答案就是f[n][tot]。复杂度不会算啊。。。O(T*2^n*n*2^n)???原创 2017-10-12 21:46:16 · 465 阅读 · 0 评论 -
bzoj1494 生成树计数(状压dp+生成树+矩阵倍增)
看数据,k<=5,n<=1e15,n极大,显然只能矩阵倍增去算。考虑dp,k极小,每个点最多能和前k个点连边,因此我们需要知道前k个点的联通情况,采用状压dp,用最小表示法。 我们可以先用一个DFS预处理出所有可能出现的连通性的状态。然后再枚举连通性状态S以及下一个点和S里的K个点中的哪些点连边,再判断从连通性状态S转移出来的新状态S′是否是合法的,若合法,在邻接矩阵里,标记从S到S′的方案数加1原创 2017-10-12 22:37:48 · 633 阅读 · 0 评论 -
bzoj3055 礼物运送(Floyd+状压dp)
先Floyd预处理出两点间最短路径,然后状压dp,dp[s][i]表示状态为s的点都遍历了,停在i的最小时间。枚举一个j去转移就好了。然后处理出f[s],表示遍历了s状态的点的最小花费。然后枚举A遍历了哪些点,B必须遍历了其余点与1.取最大值就是最慢的,更新答案即可。复杂度O(2^n *n*n)注意初值只能给dp[1][1]=0.一开始在其他点都是非法的。原创 2018-01-13 22:03:33 · 465 阅读 · 0 评论 -
bzoj3058 四叶草魔杖(状压dp+最小生成树)
正解是最小生成树+状压dp。暴力的求出每个集合的和,若为0,则对这个集合做最小生成树,它的mst就是使得这个集合的点都合法的代价。然后如果s1,s2两个集合不重复,且都可以合法,则s1与s2的并集也可以由他俩的代价和实现合法,状压转移一下取最小值即可。(我本以为这样的转移会T,但是想一想常数应该极小。)原创 2018-01-13 20:53:09 · 434 阅读 · 0 评论 -
loj6121「网络流 24 题」孤岛营救问题(状态压缩+spfa)
又是一道网络流24题中的最短路x 读题读了半天才读懂,我可能傻掉了。可以状压分层图来跑最短路即可。点数应该是O(nm2p)O(nm2^p)的。可以最后连向一个超级汇,方便得到答案。原创 2017-12-17 20:45:37 · 440 阅读 · 0 评论 -
loj6009「网络流 24 题」软件补丁(状态压缩+spfa)
首先n很小,我们可以压缩状态来表示每个问题的修复情况,0表示未修复,1表示修好了,则我们要求的就是从0到bin[n]-1的最短路。则我们一共有O(2^n)个点,然后相当于m个转移,求一下最短路就好啦。复杂度O(2nm)原创 2017-12-11 22:14:27 · 344 阅读 · 0 评论 -
NOIP2017提高组D2
D2 T1.cheese并查集 T2.treasure状压dp(爆搜) T3.phalanx线段树(暴力),只会80分。原创 2017-11-22 21:39:39 · 485 阅读 · 0 评论 -
NOIP模拟10.26
Poetize11 A.rainbow. 挂精度了。30。思路好像也有点问题·。。。正解是二分答案,通过勾股定理求出每个半圆能够覆盖的线段。此时问题转化为线段覆盖问题,排序扫描一遍即可。(直接拿圆判可能会有特例?) B.clover。状压dp+dfs瞎搞。。70. C.fin。dp打表了AC hh。实质上可以根据这道题的特性,把dp优化下,简直黑科技。处理出深度为d时,可能的最大节点数和最小节原创 2017-10-26 16:28:31 · 387 阅读 · 0 评论