状态压缩DP基础题解题报告

POJ 2411 Mondriaan's Dream

铺砖块最基本的题。设dp[i][state]为贴到第i行,前一行的状态为state时的方法数,枚举两层的状态来转移,先判断转移是否合法(即保证上一层是贴满的)。两发AC代码中第一发是按行递推的写法,第二发是逐格递推的写法。

POJ 1038 Bugs Integrated, Inc.

在第i行放置砖块时,要考虑到前两层砖快的放置情况,因此用3进制来保存两层的状态,1表示i-1行有限制,2表示i-2行有限制,0表示无限制。设dp[i][state]为贴到第i行,且前两行的状态为state时能贴的最大数量。转移时枚举第i层每一个状态,然后用dfs来转移到第i+1层。注意3进制的解压和压缩。

SGU 131 Hardwood floor

设dp[i][state]为贴到第i行,前一行的状态为state时的方法数,然后枚举状态,用dfs来找出所有可行转移。题目给出两种砖快,其实只要dfs时多几种讨论即可。

SGU 132 Another Chocolate Maniac

要求放置尽量少的砖快,使矩阵中不能再放砖块。在铺第i层时,可能会受到第i-2层的影响(比如某个位置第i-1层和i-2层都是空的,那么第i层就不得不贴),因此需要记录前两层的状态,设dp[i][state1][state2]表示前两层的状态下的最小值,依旧dfs转移。

SGU 223 Little Kings

在矩阵里放k个国际象棋里的王的方法数。状态同1*2砖块,就是dfs转移时需要考虑前面三个和左边一个的情况。

SGU 225 Little Knights

和上题稍微不一样的地方是这次放置马。咋看下也是水题。但是,这题隐含的重口属性啊。马是跳两层的,so显而易见需要维护两层状态,但是按照一般方法开是不行的,需要空间2^20*10*100*longlong,MLE了。而事实上,可行状态是不多的,n为10时貌似才30W可行状态,所以用个数组来映射可行状态就可以了。如果只是这样,当然口味不够重。事实上,0.5S的时限应付n<=8的情况是没有问题的,但是。。当n为9或10时,表示笔者无力了,只能打表水过去。。(事实上网络流传的题解没有见到过9和10不打表的解法,倘若有大神不打表过去,跪求科普。。)

ZOJ 1346 Comparing Your Heroes

题意是问你给一些名字排序,他们有些有先后限制,问排序的方法数。设dp[state]为已经倒数几名已经排好序的名字的集合的方法数,当再加入一个人时,如果集合中不存在能打败他的人,转移才可行。

POJ 3254 Corn Fields

在一个n*m的某些格子有限制的矩形中放置砖块,砖快不能相邻,问总的放置方法数。dp[i][state]表示第i行放置状态为state时的方法数,注意dfs的时候需要考虑某些土地不能放的情况,还有,上一行的不能放置格转移后等于空格。第二发为逐格递推。

POJ 1185 炮兵阵地

三进制状态压缩。0表示没有限制,1表示i-1行有限制,2表示i-2行有限制。继续dfs转移。

HDU 3001 Travelling

每个城市要求最少访问一次最多访问两次的曼哈顿路径,问最小花费。用三进制来处理访问次数的问题,设dp[state][pos]为访问集合为state并且现在位置为pos的最小花费。然后由小到大枚举集合来转移即可。

POJ 2288 Islands and Bridges

问在题设计算方式下走曼哈顿路径能获得的最大价值以及方法数。题设的计算方式要关联当前位置的前两个位置,因此设dp[state][i][j]为前前个访问i,前个访问j下的最大值及方法数,由小到大来枚举集合转移。

以上题目代码链接

HDU 3681 Prison Break  代码链接

笔者这道题是状态压缩dfs过去的。先用最短路预处理出特殊点之间的最短距离,建图,然后二分猜电池容量,用dfs判断可行性。

POJ 2430 Lazy Cows

求用k个矩形来包含所有牛的最小包含面积。矩形形状为2 * 1.5e7,牛只有1000只,显然需要按照有牛的位置来dp。设dp[i][j][s]为到第i列的牛使用了j个矩形,并且矩形的集合为s时的最小包含面积。这里集合s有两个位,表示某列上单独有矩形。另外再用一个xp[i][j]来表示到第i列的牛使用了j个矩形,且当前列的两个位都被一个矩形包含时的最小包含面积。转移细节见代码。

POJ 2436 Disease Management

每只牛有一些病,你需要选择尽量多的牛来产奶,但是你选择的牛包含的病的种类数量有限制。因此设dp[s]表示病集合为s时的最多牛数,对每头牛,能够包含它的病集合的值加1,最后在可行集合中取最大值为答案。

POJ 2541 Binary Witch

女巫最多只关注13天的匹配情况,因此将匹配情况压缩,每次由大到小查看是否有符合的值存在,存在则输出。有一个坑,例如: ‘00011’和‘11’,一个表示预测5天,一个表示预测两天,但是他们映射到的值确是一样的。因此,在每个状态前补一个最高位来避免前导0,即变成‘100011’和‘111’。

POJ 2836 Rectangular Covering

问用矩形覆盖平面上15个点的最小覆盖面积,矩形不能退化。考虑覆盖平面上两个点的最小面积,必然是以这两个点为端点的矩形面积最小。那么用dp[s]表示已包含点集为s时的最小覆盖面积,然后转移时选择一个新点和任意一个点来构成矩形,注意,位于这个矩形覆盖范围内的点也要加入当前点集。对于共线的两个点需要处理成1*x的矩形。在最优解下是不会有矩形重叠的,因此不需要考虑处理重叠部分。

POJ 1699 Best Sequence

设dp[s][i]为已连接的线段的集合以i结尾的最小长度,注意处理线段完全包含的情况。

POJ 2688 Cleaning Robot

对特殊点跑最短路,建图。状态dp[s][i]表示已访问集合为s并且现在在i的最小值。

POJ 3411 Paid Roads

设dp[s][i]表示付过钱的路集合为s,并且现在在i的最小值。注意付一次钱只能经过一条路一次,但是这题可能会经过同一条路多次。这里笔者写的4进制。第二位表示某条路用方式1付过钱,第一位表示某条路付过钱。

POJ 2686 Traveling by Stagecoach

dp[s][i]表示用了的票的集合,当前在城市i的最小值。

POJ 1482 It's not a Bug, It's a Feature!

dp[s]表示当前bug集合为s时的最小值,主要是转移可行性的判断,见代码。

POJ 3719 Art of Balance

树DP+状态压缩。dp[u][s]表示在节点u的子树中放置集合为s时的最小值,dp[u][s] = min(dp[ls][ns] + dp[rs][s^ns] + calc(ns,s))。表面上看复杂度O(n!),实际上有大量子状态重复。

POJ 1795 DNA Laboratory

上面某一题的打印路径版本,把完全包含串直接删掉,这样比较容易处理。

POJ 3593 Sea Base Exploration

对特殊点跑最短路建图,由于同一种矿可能有多个位置,但是每种矿的点只需要访问过一个即可。设dp[s][i][j]表示已经访问过的种类的集合s并且现在在种类i的第j个点的最小值。这题的trick是在完全收集完所有种类的矿之前不能经过出发点,在最短路建图时处理一下就可以了。

POJ 2088 Long Night of Museums

设dp[s]表示已访问过的集合为s时的剩余时间最大值,时间剩余最大为420。然后dfs,注意剪枝。

以上题目代码链接

HDU 4433 locker 代码链接

这题不是状态压缩,但是和铺砖块的状态压缩题极像,因此也放在这里。dp时只需要记录前两格的状态即可。写了一个记录三格的代码,时间复杂度伤了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值