
动态规划—状压dp
文章平均质量分 77
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
poj 1739 Tony's Tour(插头dp)
题意:给出地图,起点是(N,1),终点是(N,M),有障碍物,求有多少种方案能从起点到终点。题解:非环形的插头dp,特判一些起点和终点的dp,还要注意一点,从上往下dp的时候因为起点是左下角,所以不存在不建立新插头的方案!不然未走的空格子就被计算成了路径,反而增加累赘的方案数。#include#include#include#include#include#inc原创 2015-01-30 10:21:13 · 597 阅读 · 0 评论 -
hdu 2510 符号三角形 (状压dp打表存入文件,O(1))
题意:给出一个只有正负号组成的金字塔,金字塔满足同号的正,异号得负。例如:+ + - + - + + + - - - - + - + + + - - + + - - + - - - +题解:dp[i][cnt] opt[i][st] dp表示第i行个数加号个数为cnt的方案数,opt表示第i行状态为st时加号的个原创 2015-02-18 13:59:17 · 541 阅读 · 0 评论 -
zoj 3471 Most Powerful(状压)
题意:给出很多个球,如果a碰撞b,则b消失,并且获得一定的能量Vab,现在给出每两个球碰撞的能量,求能获得的最大的能量。题解:状态:dp[S],S表示已经消失的球的集合。转移方程 dp[ST] = max { dp[S] + val[i][j] , dp[ST] };#include#include#include#include#includeusing names原创 2015-01-06 14:56:08 · 465 阅读 · 0 评论 -
codeforces 424E Colored Jenga (状态压缩,概率dp用hash记忆优化搜索)
题意:给出以最多6层的积木,每层可以由三个木块拼成,总共有三种颜色的木块,开始时给出了积木的排列情况,我们每次可以从积木中抽一块木块,抽木块的规则是投骰子,骰子分别投到red,blue,green,的概率为1/6,1/3,1/3.每次投骰子都要花费一分钟,如果投到的颜色不存在就等一分钟不操作。注意的是要保证不能从顶部抽,并且抽木块时不能让整个积木倒了,要保证不倒中间的木块必须存在,每次抽出的木原创 2015-03-11 15:07:21 · 1103 阅读 · 0 评论 -
FZU 2186 小明的迷宫 (TSP)
题意给出一个迷宫,然后拿到所有宝藏然后回到原点,求最短时间。#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long ll;void cmax(int& a,int b原创 2015-03-22 16:51:30 · 1322 阅读 · 1 评论 -
hihoCoder 1044 状态压缩·一 (状压dp)
题意:一个n长的序列,每个位置都有一个值w,每次连续的M个最多只能取Q个,问如何取使得获得最多的价值。题解:这题类似背包,对应每连续的序列进行转移到下个连续的序列,对于新加进来的位置有两个决策,一是取,二是不取。例如 1010,转到下个序列为0100,最后一位是新加进来的考虑取或不取的状态。于是可以这样设置dp[i][s],表示以i为结尾的M个连续序列选取的情况状态为s,获得的最大值。原创 2015-04-23 20:20:48 · 680 阅读 · 0 评论 -
codeforces 107C Arrangement (状压dp)
题意:给出n个人和n个座位,给出m对限制,每对限制要求ai这个人的座位要排在bi这个人的前面。现在要求满足条件的第y-2001大的字典序的座位排列。题解:题目挺好的,处理方法很特别。对于这样的题目,我们首先想想暴力,那就是枚举从1开始的各种满足条件的序列,其实在枚举的时候我们可以这样优化,首先枚举第一个作为排的人,然后以排好的人为基准,往下继续排计算出对应的排列数,如果排列数大于想在的原创 2015-02-20 15:26:41 · 1067 阅读 · 0 评论 -
codefroces 482C Game with Strings (概率dp神题)
题意:给出n个字符串,选择每个字符串的概率等同都是1/n,每个字符串的长度相同。现在要玩一个游戏,就是A去任意藏起来一个字符串,B通过询问这个字符串的某个位置是什么字符,然后来判断这个字符串是什么。问:询问问题的数量的期望是多少。题解:一看题目,无法下手,堪称神题啊。大牛正解:dp[s]表示状态为s的时候到问出这个字符串是什么还需要的概率,s中存的是问题。p[i]表示询问了i个问题原创 2015-02-14 16:14:59 · 667 阅读 · 0 评论 -
zoj 3375 Imperishable Night (状压dp)
题意:开始的时候有point,lv,tv.都是0。每个洞穴有四个值ai,bi,xi,yi, xi表示,yi分别表示有a类xi个,b类yi个。如果选择a类那么point+=lv,tv+=ai,如果选择b类point+=tv,lv+=bi;问,如何得到最大的值point。题解:状压dp,分别对整体状压dp,和对每个洞内部dp,对洞内部其实用贪心也可以,复杂度O(1)。分析:首先原创 2015-02-04 14:44:08 · 507 阅读 · 0 评论 -
codeforces 83E Two Subsequences (状态dp,难)
题意:给出一些串,现在要将这些串分成两个部分,每部分的要将这部分的串进行合并,合并就是将公共前后缀去掉变成一个串(每次操作两个串知道全部变成一个串为止,当让长度要尽量小)。问如何划分使得两个集合各自合并后加起来的长度最小。题解:网上的题解虽然看懂了但是还是不懂得如何操作。查了下cf大牛ac的代码,做法是这样:dp[i][s]长度为i状态为s的串的某个部位,因为每个串最多20长度可以状压原创 2015-02-21 16:00:32 · 1004 阅读 · 0 评论 -
hdu 3681 Prison Break (BFS+状压)
2010杭州赛区的题目题意:机器人从F出发,走到G可以充电,走到Y关掉开关,D不能走进,要求把所有开关关掉,且电量最少,并求出该最小电量。题解:像这种题目暂时找不到很好的解决方法,可以试着想想暴力的方法,就是枚举每个电量是否满足,一般这样的枚举都是用二分,对于判断是否满足条件可以用状压dp来解决。我们首先要预处理出充电地点和发电站两两之间的最短路径可以用bfs解决,然后将这些点原创 2015-02-08 20:01:53 · 549 阅读 · 0 评论 -
poj 2288 Islands and Bridges(状压dp)
题意:给出一个图,每个点都有一个价值,并且价值的计算方法是这样的:举个例子,如果G是一个未完成的图,u-v是一条边,且u在G中v不在G中,那么现在走到v并且把v加入到G中,于是价值要加上val[v]+val[u]*val[j] u是v的前驱。如果出现u-v ,v-t, t-u 这样的三角环那么价值要多加上val[u]*val[v]*val[t];题解:dp[S][i][j]状态为S时上原创 2015-01-01 17:33:51 · 448 阅读 · 0 评论 -
Codeforces8C(状压dp)
题意:一个人在起点,有许多物品散落在各个地方,现在给出人起点的坐标和物品的坐标,然后给出一个要求,每次最多只能拿两个物品拿完物品必须回到原点装到包里面,求最短路程的方案,答案和路径都要输出。这题如果是超级暴力即状态和两个点都全部枚举会超时,稍微优化下,因为先去哪个都是一样的,因为都 要回到原点,这样相当于每次是从原地出发找出然后回去,所以首先枚举状态,然后枚举第一个点,这时候先转移这个点的原创 2014-12-08 12:31:25 · 697 阅读 · 0 评论 -
FZU 1977 Pandora adventure (插头dp)
题意:给出一个地图,包含三种格子的地图,'O'表示必须走的点,'*'表示可以走的点,'X'表示不能走到的点。问走完必须走的点的回路个数题解:这题很明显是单回路问题,但是格子有三种,因此就无法确定左后一个非障碍位置,因为我们引入一个变量标记是否某个状态是否已经形成回路。具体做法:每次将状态解压出来时都要让标记变量赋值为状态的最高位(最高位存的就是否是已经有回路的标记),每次在装以前要判断原创 2015-01-29 20:38:18 · 589 阅读 · 0 评论 -
hdu 3377 Plan(插头dp)
题意:给出一个迷宫从(1,1)到(n,m),迷宫的每个格子有一个分数,走了这个格子就可以得到这个格子的分数,如何得到最大的分数和。题解:和以往的dp不同,这个可以走回头路,相当于绕来绕去,这样不能用普通的dp做,插头dp解决之,模板改下就过了2a。#include#include#include#include#include#include#includeu原创 2015-01-29 23:03:39 · 651 阅读 · 0 评论 -
hdu 1964 Plan (插头dp)
题意:给出一个迷宫,并且迷宫可走的格子量量之间有间隔墙,打破强需要一些话费,现在问如何走完所有的格子并且让总的花费最小。题解:这题和之前的计数类问题相似只不过改动dp方程一些地方而已,其实这个和之前的状态压缩题目对比就很容易理解这样转移。轻松1a,kuangbin的模板就是牛逼!赞!#include#include#include#include#include#incl原创 2015-01-29 21:58:44 · 525 阅读 · 0 评论 -
ural 1519 Formula 1(插头dp)
题意:给出一张地图,'*'表示障碍物,'.'表示空的,求这个图的哈密顿回路个数。题解:这题和hdu1697相识,但是这题是求单回路,因此要实现单回路必然满足一个特性,最后一个空的也就是最右下角空的格子才将同一个联通分量连在一起。kuangbin的模板非常给力,弥补了一点思维上的缺陷。学习了一点,最小表示法的写法void decode(int code[],int m,l原创 2015-01-29 19:01:50 · 461 阅读 · 0 评论 -
hdu 1697 Eat the Trees(插头dp)
题意:给出n*m的地图,地图有些地方有障碍物,没障碍物的地方有种树,问如何吃掉所有的数并且路线要形成环。题解:这是一题基础的插头dp,第一次碰插头dp学习了kuangbin的代码,然后很轻松的ac了。养成自己的代码风格的模板这样就能比较好的写这类dp。这题可以作为模板使用。#include#include#include#include#include#inc原创 2015-01-29 19:05:39 · 628 阅读 · 0 评论 -
poj 3133 Manhattan Wiring (插头dp)
题意:一个n*m的地图,有三种类型的格子,1表示障碍物,0表示空,2、3分别表示不同类型的,现在要将2和2,3和3相连(都只有一对),当然不能交叉,求最短的和。题解:这是另外一类的插头dp问题,多路径的问题。应为插头类型较多所以考虑用多进制表示,这里有4格子,因此考虑用3进制表示法做,但是由于4进制比较高效,因此用四进制做。题解附了注释,应该很详细了。#include#inclu原创 2015-01-30 12:47:10 · 619 阅读 · 0 评论 -
zoj 3466 The Hive II(插头dp)
题意:给出蜂巢形状的地图,有障碍物,求走遍蜂巢的回路个数题解:多回路的加强版,这题真心难做,很难想到,按照列dp会更简单点。具体看代码#include#include#include#include#include#include#includeusing namespace std;typedef long long lld;#define oo 0x3原创 2015-01-30 16:05:21 · 529 阅读 · 0 评论 -
poj1185 炮兵阵地(状压dp)
这题和郑长——派兵布阵相似,同理按行dp,炮兵的范围和那个一样都涉及了两行,于是设计状态也是一样的#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define ep 1e-9#define oo 0x3f3f3f3f原创 2014-12-06 12:15:27 · 452 阅读 · 0 评论 -
hdu 3001 Travelling(3进制压缩)
#include#include#include#include#includeusing namespace std;typedef __int64 lld;#define oo 0x3f3f3f3f#define Mod 1000000007#define maxn 59100int dp[maxn][12];int dit[maxn][12];int st[12];原创 2014-12-29 01:24:25 · 417 阅读 · 0 评论 -
poj3311 Hie with the Pie(最短路+状态dp)
如果我是新手我肯定用最短路做,结果肯定被坑,因为送外卖的人可以重复的走某个道路多次,反正只要能够使最后的路程最短并且会回到送外外卖的起点就ok。那么只能用状态压缩dp了,看了下数据范围很小,状压无压力。设置状态:dp[st][k] 状态为st是终点为k的最短距离。状态方程:dp[st][k] = min(dp[st][k], dp[i][j] + dis[j][k])#incl原创 2014-12-05 01:59:57 · 547 阅读 · 0 评论 -
codeforces 453B Little Pony and Harmony Chest (离散化+dp状态压缩)
题解:给出n个数a[n],然后要求一另外n个数b[n]满足 sum{|a[i]-b[i]|}最小。b[n]内的元素要满足任意两个都是互质的。题解:状态压缩,为什么?对于这样数据方位小的求最有解并且要某个状态要表示的东西很多那么普通dp绝对不行,那么久可以考虑状态压缩,dp[i][j]表示前i个数素数因子的选取状态为j时的最小差值和。说实话想不到这样状压,看了大犇的才懂,这样技巧性比原创 2015-02-03 16:52:08 · 765 阅读 · 0 评论 -
hihoCoder 1170 机器人 (状压dp)
题意:有16种颜色的球,现在有n个这样的球排成一列,要求将这些球变成所有相同颜色必须在一起的状态,每次只能交换相邻的球。题解:这题的做法并不知道如何解释,只是意会了而已。预处理出每种颜色的球变换到其他颜色的球前面对应的步数,事实上这个步数是相对某个状态来说的。然后就是状态压缩,每次添加一种颜色的球进去。注意:预处理也是有技巧的,暴力必然超时。#include#includ原创 2015-05-13 16:57:52 · 849 阅读 · 0 评论