题目链接: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)
我事先把每一行的合法状态存下来了,这样可以避免对无用状态的判断。
#include
#include
#include
#include
#include
#include