思路:

参照blog,用状压DP做,和题解稍微有点不一样,我这里直接储存了状态而不是索引。

这一题的问题是怎么判断相邻不能种,我们用2进制来表示每一行的种植情况。我们将每一行所能够造的所有可能都打表(即认为每一块都能种),然后将每一行不能种的地方用2进制保存下来,两者&运算聚能知道是否有重合,重合即此方法排除;上下两行同理;判断左右两块则是左移后&运算。

状态DP做的时候想着2进制时候的表示会好做点

代码:

#include<cstdio>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
const int N = 500+5;
const int MOD = 100000000;
const int INF = 0x3f3f3f3f;
using namespace std;
int n,m,top;
ll dp[15][1<<12+5];
int state[600],cur[15];
void init(){ //所有可能状态
top = 0;
int tot = 1 << n;
for(int i = 0;i < tot;i++){
if(i&i<<1) continue;
state[++top] = i;
}
}
int main(){
scanf("%d%d",&m,&n);
init();
memset(dp,0,sizeof(dp));
for(int i = 1;i <= m;i++){
int tmp;
cur[i] = 0;
for(int j = 1;j <= n;j++){
scanf("%d",&tmp);
if(tmp == 0){
cur[i] += 1<<(n - j); //记录每一行不能种的
}
}
}
for(int i = 1;i <= top;i++){
if(cur[1]&state[i]) continue; //冲突
dp[1][state[i]] = 1;
}
for(int i = 2;i <= m;i++){ //第i行
for(int j = 1;j <= top;j++){ //i状态
if(cur[i]&state[j]) continue;
for(int k = 1;k <= top;k++){ //i-1状态
if(state[k]&cur[i-1]) continue;
if(state[j]&state[k]) continue;
dp[i][state[j]] += dp[i - 1][state[k]];
}
}
}
ll ans = 0;
for(int i = 1;i <= top;i++){
ans += dp[m][state[i]];
ans %= MOD;
}
printf("%lld\n",ans % MOD);
return 0;
}

最新文章

  1. 在vs中char类型的实参与LPCWSTR类型的形参类型不兼容怎么解决?
  2. java -- getOutputStream() has already been called for
  3. Codefroces 750C:New Year and Rating(思维)
  4. seaJs的简单应用
  5. Java基础知识学习(六)
  6. linux command file/type which/whereis
  7. C++学习44 格式化输出,C++输出格式控制
  8. Extjs4 使用store的post方法
  9. BootStrap2学习日记2--将固定布局换成响应式布局
  10. eclipse代码格式化
  11. 对XXX(数字)安全卫士实在是忍无可忍了,为什么一定要像日本鬼子强奸妇女一样强奸我们这些弱小者
  12. The maximum string content length quota (8192) has been exceeded while reading XML data
  13. Doctype 文档类型,标准模式,混杂模式
  14. 就是要你懂Java中volatile关键字实现原理
  15. nodejs 全局变量和全局对象
  16. Git 忽略特定文件或文件夹
  17. jQuery实现动态分割div
  18. Jmeter --- 组件执行顺序与作用域
  19. android udp 无法收到数据 (模拟器中)
  20. java基础篇---反射机制

热门文章

  1. JS-元素大小深入学习-offset、client、scroll等学习研究笔记
  2. 【BZOJ5101】[POI2018]Pow&#243;d 并查集
  3. (java部署篇)eclipse ~ 自动补全词的各种控制(转)
  4. Thinkphp --- 去掉index.php
  5. C#生成流水号编码[a-z(不包括i和o) 按0-9 a-z的顺序)]
  6. java 常见几种发送http请求案例
  7. 使用log4net做应用程序全局日志记录保存在数据库中
  8. Constructor Overloading in Java with examples 构造方法重载 Default constructor 默认构造器 缺省构造器 创建对象 类实例化
  9. Linux环境下proc的配置c/c++操作数据库简单示例
  10. Mysql中的auto_increment