![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
状压dp
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj1087[SCOI2005]互不侵犯King
题意:给定n,k,在n*n个棋盘里放k个棋子,让他们不能互相攻击,有多少种方案,一个棋子可以攻击他的八个方向。题解:很久没打状压DP了,一脸懵逼,本来状压就不是很好,现在弱的一匹。。表示这题一脸不可做,不得已去膜了一波题解。 有一个很好的题解http://blog.csdn.net/qpswwww/article/details/34516641 这题主要是如果直接dp状态数会很大,那么我们就可原创 2017-02-20 21:00:41 · 302 阅读 · 0 评论 -
bzoj3195[Jxoi2012]奇怪的道路 状压DP
Description小宇从历史书上了解到一个古老的文明。这个文明在各个方面高度发达,交通方面也不例外。考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n。m条道路连接在这些城市之间,每条道路将两个城市连接起来,使得两地的居民可以方便地来往。一对城市之间可能存在多条道路。 据史料记载,这个文明的交通网络满足两个奇怪的特征。首先,这个文明崇拜数字K,所以对于任何一条道路,设它连接的两个城原创 2017-08-03 17:26:19 · 359 阅读 · 0 评论 -
5322. 【GDOI2017模拟8.21】小朋友 状压dp
n<=1000,3<=k<=10,ai<=100000n<=1000,3<=k<=10,ai<=100000 状压dp的题目,据出题人说是裸题,奈何我状压一直是最弱的= =,问了ymwdalao才知道怎么打。。讲道理基本上超过2000多B的状压我都不大会。。 设f[i][j][l]表示当前选到第i个,j是状态,表示i-k到i的状态,l表示有多少个三人桌。 那么明显,三人桌只能有3个,4个的话就原创 2017-08-21 16:09:23 · 261 阅读 · 0 评论 -
bzoj1076 [SCOI2008]奖励关 状压+期望dp
题意就不说了。分析:表示我状压本来就不好,加上个我不擅长的期望就彻底懵逼了。。 一开始想到把物品选或不选的方案设为状态,设f[i][j]表示i轮后物品的状态为j。 然后。。然后我就懵逼了。按照正常套路来说,先枚举轮(从后往前好处理),然后枚举当前状态,然后再枚举上一轮的状态看上一轮的状态是否有选当前所要选的点,但是这样复杂度直接爆炸。。O(2<<30*15*100)。。后来看了一波题解,表示学习原创 2017-02-21 21:51:32 · 437 阅读 · 0 评论 -
codeforces 417D 状压DP
题意:多读英文题面有助于提高英语~~,要是你真忍不住就看代码下面吧。。一开始觉得n*2^k是不是会GG啊,后来:cf怎么可能连1e8都不能过1e9都能过不是开玩笑的。 然后开始推,明显的设f[i][j]表示前i个状态为j,有: f[i][j|a[i].s]=min(f[i][j]+a[i].cost)f[i][j|a[i].s]=min(f[i][j]+a[i].cost) 有个问题就是他要求原创 2017-09-18 22:10:41 · 544 阅读 · 0 评论 -
BZOJ1072[SCOI2007]排列perm 状压Dp
题意:给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0)。例如123434有90种排列能 被2整除,其中末位为2的有30种,末位为4的有60种。一开始看见s小于10秒想状压,然后在dp式子卡了一下才想到。。 设f[i][j]表示使用了多少位的状态,余数为j的方案数。 那么明显有f[i|(1<<k)][(j∗10+a[k])f[i|(1<<k)][(j*10+a[k]原创 2017-10-29 16:38:21 · 262 阅读 · 0 评论 -
bzoj2083 [POI2004]PRZ 状压DP
题意: 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批过,当一组全部过去时,下一组才能接着过. 队伍里每个人过桥都需要特定的时间,当一批队员过桥时时间应该算走得最慢的那一个,每个人也有特定的重量,我们想知道如何分批过桥能使总时间最少.一开始没有啥想法,直接原创 2017-10-30 18:29:35 · 245 阅读 · 0 评论 -
bzoj1097[POI2007]旅游景点atr spfa+状压DP
题意:给出一个图,要求一定经过一些点,而且经过顺序有要求,点的范围是2到k+1,问最短路径。这题卡常卡的我蛋都碎了都没卡过,最后懒得卡了。 其实很简单的一道题目如果不卡常的话,先对于1..k+1跑spfa以后,把题目要求的遍历顺序加入状态中,直接转移就可以了,挺显然的。 代码:(TLE)#include<cstdio>#include<algorithm>#include<cstring>原创 2017-11-01 14:32:55 · 206 阅读 · 0 评论 -
JZOJ5442【NOIP2017提高A组冲刺11.1】荒诞 三进制状压+欧拉序
题意:我有一个n个点,m条边的无向图,第i个点建立一个旅游站点的费用是c_i。特别地,这张图中的任意两点间不存在节点数超过10的简单路径。 为了把一切都做得完善,为了使我感到不那么孤独,我想要建造一些旅游站点使得每个点要么建立了旅游站点,要么与它有边直接相连的点里至少有一个点建立了旅游站点。我还希望这个建造方案总花费尽量少。 请求出这个花费。 czy大爷出的好题。 考场上有正解方向的想法原创 2017-11-01 22:17:35 · 310 阅读 · 0 评论 -
bzoj3886[Usaco2015 Jan]Moovie Mooving 状压DP
其实是很简单的状压..但是我太菜了没有想到。 一开始的DP方程就列错了,直接列了个求最终答案的。。 设f[i]表示状态为i时能看到的最远时间,转移显然,二分一下起始点就好了= =#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,原创 2017-07-20 12:27:27 · 382 阅读 · 0 评论 -
bzoj3446 [Usaco2014 Feb]Cow Decathlon 状压DP
还是比较明显的模型,明显是把k,p小的先做了,然后设f[i]表示状态为i的最大分值。 转移显然。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--原创 2017-07-20 10:55:31 · 420 阅读 · 0 评论 -
bzoj2734[HNOI2012]集合选数 状压DP
Description《集合论与图论》这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中。同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数 n≤100000,如何求出{1, 2,…, n} 的满足上述约束条件的子集的个数(只需输出对 1,000,000,001 取模的结果原创 2017-02-21 12:21:46 · 207 阅读 · 0 评论 -
JZOJ4702&codeforces534F 状压DP
题意就不说了。。 不说个毛啊!!!wori我就是题目没看懂所以搞了半天结果搞错了好吗QAQ。。 这里的块如果空间允许一定是两个,如果剩下的空间不足两个才能为1. 。。。。 怎么暴力怎么来。 设f[i][j][a][b][c][d][e]表示第i列,状态为j,5行的块数分别为a,b,c,d,e。 那么转移显然,把之前的全部加上就好了。 对于一个长度为m的行,我们最多能取的块数是m/2+m原创 2017-02-21 17:04:55 · 426 阅读 · 0 评论 -
JZOJ3632【汕头市选2014】舞伴(perm)
DescriptionN 个男孩,N 个女孩,男孩和女孩可能是朋友,也可能不是朋友。现在要组成N 对舞伴,要求每对舞伴都是一男一女,且他们是朋友。统计不同配对方案的数量,因为结果很大,所以只要求除以M 的余数。Input第1 行,2 个整数N,M。接下来N 行,每行N 个整数Aij,表示第i 个男孩和第j 个女孩的关系。如果他们是朋友,则Aij = 1,否则Aij = 0。Output1 个整数,表原创 2017-02-25 15:23:17 · 336 阅读 · 0 评论 -
bzoj1688 [Usaco2005 Open]Disease Manangement 疾病管理
分析:我真是菜的不行。。知道是状压DP结果硬是不知道怎么打。。这是药丸的节奏。。尤其是当我看见hzwer:无脑状压。的时候心情是崩溃的。。设f[i]表示状态为i时最多选的奶牛数。 设t[i]表示每个奶牛的状态。 那么明显,,f[t[i]|j]=max(f[j]+1)。。最后找到符合情况的f[i],与ans取个max就行了。。#include<cstdio>#include<algorithm>原创 2017-03-07 21:34:06 · 457 阅读 · 1 评论 -
bzoj1725 [Usaco2006 Nov]Corn Fields牧场的安排
状压dp,预处理出: line[i]:第i行状态是否合法 ok[i][j],表示第i行的状态到第j行的状态是否能转移。 situ[i][j],表示i状态转到j状态是否可行。 设f[i][j]表示第i行状态为j时的答案,那么我们枚举一个k,对于所有合法的,能够转移到j的k,加上去。最后答案就是sigma(f[n][i])。#include<cstdio>#include<cstring>#原创 2017-04-14 10:30:25 · 362 阅读 · 0 评论 -
bzoj2621[Usaco2012 Mar]Cows in a Skyscraper 状压dp
。。比较基础的状压dp,可以拿来练手,有背包的性质。 设f[i]表示状态为i时的最小答案,g[i]表示状态为i是当前这个电梯剩下的最大空间。 那么我们枚举每一头牛看看超不超过当前空间,超过就不装或者新开一个电梯,最后输出满状态时的f就可以了。 具体细节看代码。#include<cstdio>#include<cstring>#include<iostream>#include<algor原创 2017-05-29 15:31:50 · 371 阅读 · 0 评论 -
bzoj4145 [AMPPZ2014]The Prices
分析:我真是弱的不行。。 设f[i][j]表示前i个商店的购买状态为j的最小花销。。 明显有f[i][j]=f[i-1][j]+d[i]; 枚举没有买的物品k,f[i][j|(1<#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i+原创 2017-03-07 22:38:56 · 352 阅读 · 0 评论 -
bzoj3312[Usaco2013 Nov]No Change 状压DP
比较明显的模型,一眼状压。 一开始想的设f[i][j]表示前i个,状态为j,然后发现会T。 后来发现原来i可以去掉,设f[j]表示状态为j时能买的最多账单。 二分加速一下,然后求出最大的f,用ans存一下,然后答案就是sum[m]-ans。 一开始忘记判断-1白白WA了两发。#include<cstdio>#include<algorithm>#include<cstring>#inc原创 2017-07-20 10:26:02 · 261 阅读 · 0 评论 -
NOIP2017提高组 Day2T2宝藏 状压DP
题目就不说了吧。。 搜索好像也能过,不过是启发式才行。。何况比赛打得也是状压。。 其实不算很难吧,但是我比较菜所以挂了。 总是想着如何枚举,但是这题直接枚举转移的话好像不大可做。 所以预处理出两个状态之间的转移代价,即w[s1,s2]表示从s1转移到s2的代价,保证s1&s2==0,即s1与s2不相交。 然后直接转移就好了,复杂度是3^n*n^2,但是用枚举子集转移的方法可以去除冗余状态,原创 2017-11-21 15:26:59 · 1386 阅读 · 1 评论