题面

显然是个状压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\) 是上一行的状态。

代码

最新文章

  1. MySQL Cluster 7.3.5 集群配置参数优化(优化篇)
  2. javascript生成对象的三种方法
  3. xhprof学习笔记
  4. 《python核心编程》笔记——系统限制
  5. [POJ 1988] Cube Stacking (带值的并查集)
  6. emWin显示文本字符-【worldsing笔记】
  7. 在windows下的mysql使用
  8. RMAN-FORMAT-CONFIGURE及动态性能表
  9. perl HTML::TreeBuilder::XPath
  10. [LeetCode] Search in Rotated Sorted Array [35]
  11. OOP 创建对象的7种方式
  12. (转) QImage总结
  13. fis3+vue+pdf.js制作预览PDF文件或其他
  14. asp:GridView控件使用FindControl方法获取控件的问题
  15. Jupyter Notebook启动不会自动打开浏览器,每次都要自己打开浏览器输入网址
  16. Redis设置Key/value的规则定义和注意事项(附工具类)
  17. .Net WebRequest异步请求与WebClient异步请求
  18. hasura graphql-engine v1.0.0-alpha26 版本新功能
  19. ASP.NET与ASP.NET MVC 中Cache的总结
  20. zookeeper报错 JAVA_HOME is not set

热门文章

  1. 16、mysql主从复制问题总结
  2. 本地无法访问虚拟机的tomcat
  3. Neural Approaches to Conversational AI
  4. 第十一章:random库概述
  5. HAl库控制L298N直流电机旋转笔记
  6. Linux | 命令的参数
  7. 学前端的第一门语言HTML
  8. Java基础00-方法10
  9. c++中的基本IO
  10. lucene 类介绍