题目大意 :农夫约翰有n*m块地,其中一些地荒掉了。玉米是一种傲娇的植物,种在相邻的地里会导致不孕不育。求所有种法数对100000000求余。

读入:第一行一个n一个m,

接下来是一个n行m列的矩形,表示田地的状态(1表示可种植,0表示不可种植)

输出:一个整数,表示总的方法数 % 1000000000的结果

首先我们把原图的每一行转成二进制数存储(此处及以下原图均指读入的田地状况),1表示可以种植,0表示不能种植
以行为阶段,对于每一行,我们把可以种的标记为1,不能种则标记为0
分析同一行中,我们由题目可以知道,两个1肯定不相邻,
我们想把当前状态左移1位再与原数相&,若结果不为0,则肯定有两个1相邻了
但是同样我们要注意的是,两行之间相邻也是不允许的
例如:
0001010
0001001
第一行第4个位置为1,下一行第4个位置仍为1,上下两个1相邻了,这样也是不允许的
这样我们设一个状态为k,由状态k转移到状态j,若j&k!=0,则出现了上下两个1相邻,这样是不符合的
接着我们必须符合原图,也就是原图中不能种的地方我们一定不能种,原图中不能种的地方为0,能种的地方为1
但是比较麻烦的是,原图能种的地方我们不一定种,原图不能种的地方,在我们的状态中可能种,我们没办法区分这两种情况
那么我们试着翻转一下操作
存原图时,我们用0表示能种,1表示不能种(最初我们用1表示能种,0表示不能种)
这样我们可以直接相&,若出现了1,则一定不能种。因为此时我们标记为1的位置,按照题目要求,在原图中一定要标记为0,如果某个位置我们种了而原图中

不能种,那么相&得到的就是1,这样是不行的。问题就解决了。
然后我们可以以非常显然的方式得到dp数组
f[i, j]表示在第i行(i为一个m位的二进制数),状态为j时,所有的种法,这样得到的状态转移方程就是:
f[i, j] = Σf[i - 1, k]( j & k == 0 && j & a[i] == 0 && k & a[i - 1] == 0)
初态:f[0, 0] = 1;
目标:Σ{f[n, i]}(i为m位二进制数,0 <= i < 1 << m)

 #include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define ll long long
using namespace std;
const int mod = ;
int n, m, h;
ll f[][ << ], ans = ;
ll a[]; inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return x * y;
} int main() {
n = read(), m = read();
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j) {
h = read();
a[i] <<= ;
a[i] += (h == ) ? : ;
}
f[][] = ;
for(int i = ; i <= n; ++i)
for(int j = ; j < << m; ++j) {
if(j & (j << ) || j & a[i]) continue;
for(int k = ; k < << m; ++k) {
if(j & k || k & a[i - ] || k & (k << )) continue;
f[i][j] = (f[i][j] + f[i - ][k]) % mod;
}
}
for(int i = ; i < << m; ++i)
ans = (ans + f[n][i]) % mod;
cout << ans << '\n';
return ;
}

【状压基础题】poj3254 Corn Fields的更多相关文章

  1. 【状压DP】poj3254 Corn Fields

    题意: 一块n*m的田,1表示这个地方可以种植,0代表这个地方不能种植.植物种植还必须满足两株植物不能相邻(横竖都不行).问共有几种种植方法,而且当什么都不种时认为是一种方法. 解题思路: 种植用1表 ...

  2. 状压DP POJ 3254 Corn Fields

    题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...

  3. 状压 DP:[USACO06NOV] Corn Fields,[USACO13NOV] No Change

    [USACO06NOV] Corn Fields (试题来源:Link ) 题目描述 Farmer John has purchased a lush new rectangular pasture ...

  4. poj3254 Corn Fields 利用状态压缩求方案数;

    Corn Fields 2015-11-25 13:42:33 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10658   ...

  5. poj3254 Corn Fields (状压DP)

    http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  6. POJ3254 Corn Fields(状压DP)

    题目给个n×m的地图,1可以放玉米0不可以,现在要放玉米,玉米上下左右不能相邻,问放法有几种. 当前一行的决策只会影响下一行,所以状压DP之: dp[i][S]表示前i行放完且第i行放玉米的列的集合是 ...

  7. poj3254 Corn Fields

    orn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17989   Accepted: 9474 Descr ...

  8. 【原创】【状态压缩DP】POJ3254 Corn Fields【新手向】

    一开始根本不会状压dp,上网各种找题解,但发现他们写的都很......反正我作为一个没有接触过状态压缩的,根本看不懂! 然后看了好多状态压缩的题的题解,总结了一下思路,思路很重要,有了思路转换成计算机 ...

  9. POJ 2923 状压好题

    Relocation Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2631   Accepted: 1075 Descri ...

随机推荐

  1. 种树 by yoyoball [树分块+bitset]

    题面 给定一棵树,有点权 每次询问给出一些点对,求这些点对之间的路径的并集上不同权值的个数,以及这些权值的$mex$ 思路 先考虑只有一对点对,只询问不同权值个数的问题:树上莫队模板题 然后加个$me ...

  2. 【BZOJ 2753 滑雪与时间胶囊】

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2843  Solved: 993[Submit][Status][Discuss] Descripti ...

  3. 自己模拟实现一下Google的赛马Doodle

    今天的Google Doodle是个动态的,是一个骑马的动态Doodle,是谷歌纪念英国实验摄影师埃德沃德·迈布里奇182周年诞辰,埃德沃德·迈布里奇是运动摄影的开创者,所以谷歌涂鸦以一个运动的摄影作 ...

  4. linux内存条排查

    已发现2个内存错误,应用名称(kernel:),日志内容(hangzhou-jishuan-DDS0248 kernel: sbridge: HANDLING MCE MEMORY ERROR han ...

  5. Linux下rsync 安装与配置

    1.什么是rsync Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的“Rsync算法”来使本地和远 程两个 ...

  6. MySQL中大于等于小于等于的写法

    由于在mybatis框架的xml中<= , >=解析会出现问题,编译报错,所以需要转译 第一种写法: 原符号 < <= > >= & ' " 替换 ...

  7. 【UOJ131/NOI2015D2T2-品酒大会】sam求后缀树

    题目链接:http://uoj.ac/problem/131 题意:给出一个字符串,第i个字符对应的值为a[i], 对于i∈[0,n),求最长公共前缀大于等于i的字串对个数,并求这些字符串对开头对应值 ...

  8. bzoj1575 [Usaco2009 Jan]气象牛Baric

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1575 [题解] 动态规划,令f[i,j]表示前i个选了j个,且第i个必选的最小值. 转移就枚 ...

  9. sublime text 2学习(二):创建可复用的代码片段

    对于前端工程师来讲,写一个html页面的基本结构是体力活,每次去拷贝一个也麻烦,sublime text 2 提供了一个很好的复用代码片段.下面介绍一下创建一个html5的代码片段的过程. 在菜单上点 ...

  10. LCD实验学习笔记(四):系统时钟

    一般CPU频率(FCLK)高于内存.网卡等设备频率(HCLK),而串口.USB.I2C等设备频率(PCLK)更低. 系统时钟: 系统时钟源为晶振,初始频率12MHz. 通过设置MPLLCON寄存器的M ...