您的位置:首页 > 其它

TOJ 1684 Corn Fields -- 状态压缩DP

2014-05-29 14:56 274 查看
题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1684

题目大意:给定一个0-1矩阵,要求从矩阵中选出一些位置满足以下条件:

1.只能在值为1的位置上选

2.选出的位置不能相邻(选出位置(i, j)后,不能选(i, j)上下左右4个位置)

问有多少种选法。

分析:矩阵维度很小,直接把一行的状态压缩然后对列动态规划。记下来是因为一开始错了两遍:我用的是滚动数组,在求新值之前忘了把数组清空。顺便提一下对状态的check,如何简洁高效地判断状态是否满足上述两个条件。

对于条件1,把一行的值视为一个二进制数,先按位取反得到a,那么状态t满足条件1只需要(a & 1 == 0)。即相同位上状态与矩阵中的值不同时为1。

对于条件2,判断相邻行的两个状态t1, t2时,只需要(t1 & t2 == 0),判断同一行时,即判断状态t是否满足条件2,只需要(t & (t << 1) == 0)

我事先把每一行的合法状态存下来了,这样可以避免对无用状态的判断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: