状态压缩题目小结

因为这是对题目的小结,所以写的时候比较随意(因为之前已经写过相应的博客了)
如果需要详细的解题报告,我的博客都有,当然每道题的后面也有相应题目的解析链接。
如果后续还有的话,会补上的

1.POJ - 3254 Corn Fields

题目大意:有一个n*m的草地(草地上有的是沼泽),现在要分配牛去上面吃草,要求每头牛不能相邻(不能有公共边),问有多少种分配方案,一头牛都不分配也算一种分配方案

解题思路:这是碰到的第一道比较另类的压缩
1.首先考虑一下,每一行该怎么分配牛才不会让他们相邻,可以用状态压缩,0表示不放牛,1表示放牛,枚举一下有多少种可行的方案并纪录下来

2.接着考虑一下,因为不能相邻,而相邻的行之间又会相互影响。
考虑到第一行是比较特殊的,可以先枚举第一行的解决方案,接下来再枚举其他行。
在枚举其他行的情况时,要考虑和上一行的方案是否能共存,再考虑一下该方案是否可行(有沼泽影响)
如何判断该方案是否可行,可以先预处理一下地图,将地图也压缩成一个二进制数,0表示草地,1表示沼泽,然后将要枚举的方案和该行状态进行与运算,如果相与结果不为0,表示有牛放在了沼泽地,那么方案就不可行了
判断和上一行能否共存的判断和上面判断差不多,用该行的方案和上一行方案进行与运算,如果结果不为0,表示有两头牛放在了同一列,那么方案不可行

代码

2.POJ - 1185 炮兵阵地

这题和上题差不多,只不过是多了一个判断

代码

3.POJ - 3311 Hie with the Pie

题目大意:有一个人要送披萨到N个地方,同一个地方可以去多次,问送完所有披赛再回到店里走的最短路径是多少

解题思路:可以将所有的地方压缩成一个状态,0表示还没有经过,1表示已经经过了,然后再bfs就可以求得结果了

代码

4.ZOJ - 3471 Most Powerful

题目大意:有n个原子,两个原子相互碰撞的话,就会产生能量,并且另一个原子会消失,问n个原子能产生的最大能量是多少

解题思路:注意这题,能量有可能是负的,所以不需要每个原子都用掉。
用0表示没用,1表示用了,进行压缩

代码

5.HDU - 3001 Travelling

题目大意:有一个人想要去旅游,但是他同一个地方不想逛超过两次,问怎样逛才能使得花费达到最小

解题思路:这题和第3题差不多,只不过这题要用3进制数表示去过的城市的次数

代码

6.POJ - 1170 Shopping Offers

题目大意:有个人想去超市买商品,恰巧碰上超市优惠,问怎样买商品才能使所花费用达到最低

解题思路:可以将每件商品也当作一种打折方式,然后进行bfs
这题最多只有5件商品,且商品数量最多也只有五件,所以可以用五维的数组表示状态

代码

7.POJ - 2411 Mondriaan’s Dream

题目大意:有一人要在N*M的地板上面铺满1 * 2或者2 *1的砖,问铺满的方法有几种

解题思路:铺砖问题,可以暴力枚举每行和上一行的状态进行求解

代码

8.SGU - 131 Hardwood floor

题目大意:有一个人要用1*2的和2*2的砖铺满N*M的格子,问有多少种铺砖方式

解题思路:和上面那一题的思路是差不多的,直接暴力枚举

代码

9.SGU - 132 Another Chocolate Maniac

题目大意:有一块蛋糕,蛋糕上面放着蜡烛,现在要求你在上面铺上1*2的巧克力,使得蛋糕上面没铺的面积为1的数量达到最大,问最少要铺放多少个巧克力

解题思路:因为有空格的缘故,所以难度更加大了
如果和上面那题一样,只考虑当前行和上一行的话,就很难判断当前的空格是否可行了,所以我们变成考虑三行
设dp[i][s1][s2]为第i行的状态为s1,第i+1行的状态为s2,需要铺多少巧克力
要判断空格能否成立,就需要三行来判断,假设i-1,i,i+1为前中后,那现在枚举中和后两行,这样就可以判断巧克力的摆放是否成立了(因为有前行可以判断中行的空格是否可行)
那么该怎么枚举
首先先枚举第i行的状态,接着再枚举第i+1行铺巧克力对第i行的影响,这样第i行的状态就变了,这样就得到状态转移方程了
dp[i][s1][s2] = min(dp[i][s1][s2], dp[i-1][s3][s4] + cnt)
cnt表示将第i+1行铺成s2的状态,将第i行从状态s4变成s1需要的巧克力数量

代码

10.POJ - 1691 Painting A Board

题目大意:要在一张矩形内将所有小矩形块涂成相应的颜色,问最少需要换多少次画笔(一个矩形能被涂色只有当它上面的所有矩形都被涂色时才可被涂)

解题思路:预处理一下每个矩形能被涂色的前置条件
然后设dp[color][state]为涂到的当前颜色是color,被涂的小矩形状态为state,需要使用多少次画笔
接着就可以暴力BFS了

代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值