题目大意:

输入n m

接下来n行m列

0表示不能种玉米 1表示能

要求种玉米位置的上下左右四连通区域不能种玉米

输出方案数

Sample Input

2 3
1 1 1
0 1 0

Sample Output

9

Hint

Number the squares as follows:

1 2 3
  4

There are four ways to plant only on one squares (1, 2, 3, or 4), three ways to plant on two squares (13, 14, or 34), 1 way to plant on three squares (134), and one way to plant on no squares. 4+3+1+1=9.

 
#include <bits/stdc++.h>
#define MOD 100000000
using namespace std;
int mir[],may[<<],dp[][<<];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int num=;
for(int i=;i<(<<m);i++)
if((i&(i<<))==) may[num++]=i;
/// 等于0说明符合条件 may[]保存所有可能放置
/// 左移一位后,若不为0,说明有相邻两位同时为1
/// 如 i 为011,则 i<<1 为110,(011&110) = 1 memset(mir,,sizeof(mir));
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
int tmp; scanf("%d",&tmp);
if(tmp==) mir[i]|=<<j;
/// mir[]可理解为 i 行的镜像拓本
} memset(dp,,sizeof(dp));
for(int i=;i<num;i++)/// 枚举所有可能 判断与拓本是否可匹配
if((mir[]&may[i])==) dp[][may[i]]=;
/// 等于0说明may[i]为该行的可能放置 for(int i=;i<n-;i++) // 枚举各行 从本行推下一行 所以只需到n-1行
for(int j=;j<num;j++) // 枚举所有可能放置
if((mir[i]&may[j])==)/// 当与本行可匹配时
{ // 该放置是本行可能出现的符合条件的放置时
for(int k=;k<num;k++)// 枚举所有可能(下一行的)
if(((mir[i+]&may[k])==)&&((may[k]&may[j])==))
/// 该放置为下一行的可能放置(与下一行的拓本可匹配)
/// 且 与本行的放置可匹配时
dp[i+][may[k]]+=dp[i][may[j]];
}
int ans=;
for(int i=;i<num;i++)// 枚举所有可能放置(最后一行)
ans=ans+dp[n-][may[i]],ans%=MOD;
// 由前往后推 所以只要最后一行存在这种放置的方案
// 则表示这种方案也符合前面所有行的放置
printf("%d\n",ans);
} return ;
}

USACO 2006 November Gold Corn Fields /// 状压 oj23941的更多相关文章

  1. USACO 2006 November Gold Corn Fields

    USACO 2006 November Gold Corn Fields 题目描述: Farmer John has purchased a lush new rectangular pasture ...

  2. 【USACO 2006 November Gold】Corn Fields

    [题目链接] 点击打开链接 [算法] 状压DP [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 12 #def ...

  3. 【POJ3254】Corn Fields 状压DP第一次

    !!!!!!! 第一次学状压DP,其实就是运用位运算来实现一些比较,挺神奇的.. 为什么要发“!!!”因为!x&y和!(x&y)..感受一下.. #include <iostre ...

  4. POJ 3254 Corn Fields (状压入门)

    Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M≤ 12; 1 ≤ N ≤ 12) ...

  5. POJ 1684 Corn Fields(状压dp)

    描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...

  6. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...

  7. POJ 3254 Corn Fields (状压dp)

    题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...

  8. USACO 2006 November Gold

    POJ 3253 Fence Repair STL堆操作 我想说,STL里堆是我目前见到最蛋疼的操作. #include <cstdio> #include <cstring> ...

  9. [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp

    题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...

随机推荐

  1. Alibaba Cluster Data 开源:270GB 数据揭秘你不知道的阿里巴巴数据中心

    打开一篇篇 IT 技术文章,你总能够看到“大规模”.“海量请求”这些字眼.如今,这些功能强大的互联网应用,都运行在大规模数据中心上,然而,对于大规模数据中心,你又了解多少呢?实际上,除了阅读一些科技文 ...

  2. NX二次开发-UFUN将工程图转成CGM和PDF文件UF_CGM_export_cgm

    文章转载自唐康林NX二次开发论坛,原文出处: http://www.nxopen.cn/thread-126-1-1.html 刚才有同学问到这个问题,如果是用NXOpen来做,直接录制一下就可以了: ...

  3. NX二次开发-NXOpen窗口打印NXMessageBox&ListingWindow

    NX9+VS2012 #include <NXOpen/NXObject.hxx> #include <NXOpen/Part.hxx> #include <NXOpen ...

  4. NXOpenC#_Training_intro(cn)【转载】

  5. 由于某些原因无法博客搬家,现在换马甲了 http://blog.csdn.net/qq_32066409

    由于位置原因无法博客搬家,现在换马甲到csdn了地址如下http://blog.csdn.net/qq_32066409

  6. hexo next主题深度优化(七),cdn加速。

    文章目录 注: 正题: 免费cdn 收费cdn 个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io ...

  7. jquery操作html元素之(添加元素)

    添加新的 HTML 内容 我们将学习用于添加新内容的四个 jQuery 方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在 ...

  8. mysql实现访问审计

    mysql的连接首先都是通过init_connect初始化,然后连接到实例. 我们利用这一点,通过在init_connect的时候记录下用户的thread_id,用户名和用户地址实现db的访问审计功能 ...

  9. Java中哪个JSON库的解析速度是最快的?

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考 了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上 ...

  10. ES6 学习 -- Class

    Class的基本语法(1)// 定义类class Point { test() { console.log("hello test"); }}通过 new 定义好的类即可生成一个类 ...