显然是个状压DP。
看数据范围,不难发现算法复杂度应该是 \(O(n\times 2^n \times 2^n)\) 。
显然第一个 \(n\) 是遍历每一行的土地。 后面两个 \(2^n\) ,想都不用想就知道是暴力枚举上一行和这一行的状态。
而枚举状态这个东西比较浪费时间,所以我们可以先不考虑土地是否肥沃,把每一行的可能分布先做出来。
我们设这一行的状态是 \(i\) ,那么, \(i\) 中不能有相邻的两个 \(1\) 。可以这样 ((i & (i << 1)) == 0) && ((i & (i >> 1)) == 0) 判断。
然后我们要开一个数组记录每一行那些位置能放。我们为方便,设 \(1\) 是能放 \(0\) 是不能放。那么当我们枚举到一个状态的时候,算一下 j & map[i] ,当 i & map[i] == j 时就说明 \(j\) 中每个 \(1\) 对应到 \(map_i\) 里面都是 \(1\) ,那么这个 \(j\) 就是成立的。
接下来我们要枚举上一行的状态,然后判断两行中是否存在一个位置使得上下都被选上,那么我们算一下 k & j 即可。如果他不等于零说明这个 \(k\) 和 \(j\) 不能匹配。如果他等于零那就累加答案即可。
注:\(i\) 是行号 \(j\) 是当前行的状态 \(k\) 是上一行的状态。
相关文章:
- 洛谷 P7541 DOBRA 题解 2021-10-11
- 洛谷P1012 拼数 【题解】 2020-06-06
- 洛谷 P1462 解题报告 2018-05-13
- 【题解】洛谷P3865 ST表 2021-10-14
- 【洛谷月赛】洛谷三月月赛题解报告 2019-03-03
- 题解 洛谷P1071【潜伏者】 2019-09-11
- 洛谷P3478 [POI2008]STA-Station 题解 2019-01-04
- 洛谷—题解 P1008 【三连击】 2022-01-08