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)
我事先把每一行的合法状态存下来了,这样可以避免对无用状态的判断。
题目大意:给定一个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)
我事先把每一行的合法状态存下来了,这样可以避免对无用状态的判断。
相关文章推荐
- poj 3254 Corn Fields(状态压缩DP)
- POJ3254 Corn Fields 状态压缩DP
- tyvj 1684(状态压缩dp)
- POJ 3254 Corn Fields(状态压缩DP)
- POJ 3254 Corn Fields(简单的状态压缩dp)
- poj 3254 Corn Fields(状态压缩DP)
- poj 3254 Corn Fields (状态压缩dp)
- poj3524 Corn Fields(状态压缩dp)
- POJ 3254 Corn Fields 状态压缩DP
- poj 3254 Corn Fields(状态压缩dp)
- Corn Fields(poj3254)状态压缩dp
- poj 3254 Corn Fields (状态压缩DP)
- poj 3254 Corn Fields 状态压缩dp
- POJ3254 Corn Fields (状态压缩DP)
- poj 3254 Corn Fields 状态压缩dp
- poj-3254-Corn Fields-状态压缩DP
- 【poj3254】Corn Fields 状态压缩dp
- POJ 3254 Corn Fields (状态压缩DP)
- POJ —— 3254 Corn Fields(状态压缩dp)
- 【poj3254】Corn Fields 状态压缩dp