题目描述

农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地。John打算在牧场上的某几格里种上美味的玉米,供他的奶牛们享用。
遗憾的是,有些土地相当贫瘠,不能用来种玉米。并且,奶牛们喜欢独占一块地的感觉,于是John不会选择两块相邻的土地,也就是说,没有哪两块玉米地有公共边。
John想知道,如果不考虑玉米地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案)

输入输出格式

输入格式:

第一行:两个整数M和N,用空格隔开。

第2到第M+1行:每行包含N个用空格隔开的整数,描述了每块土地的状态。第i+1行描述了第i行的土地,所有整数均为0或1,是1的话,表示这块土地足够肥沃,0则表示这块土地不适合种草。

输出格式:

一个整数,即牧场分配总方案数除以100,000,000的余数。

思路

数据n,m<=12,基本确定是状压dp

预处理所有有效(合法)的牛分布状态

则对于一个合法的状态i,有i&(i<<1)==0

int x=1<<12, k=0;
for(re i=0; i<x; i++) if(!(i&(i<<1))) cow_state[k++]=i;

处理土地

为了方便,把土地取反,即用1表示肥沃,0表示贫瘠

for(re i=0;i<M;i++)
  for(re j=0;j<N;j++)
{
scanf("%d",&t);
corn_state[i]=(corn_state[i]<<1)|!t;
   }

dp

两行的牛状态相位与要为0
牛状态和土地(种植)状态相位与要为0 (牛只会在肥沃的土地上)

具体看代码

代码

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MOD 100000000
#define re register int
using namespace std;
inline int read(){
int x=0,w=1;
char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x*w;
}
int corn_state[13], cow_state[377], dp[13][377];
int main()
{
freopen("poj3254.in","r",stdin);
freopen("poj3254.out","w",stdout);
int x=1<<12, k=0;
for(re i=0; i<x; i++) //计算牛的有效状态
if(!(i&(i<<1))) cow_state[k++]=i; //如果是有效状态
cow_state[k]=x;
int M,N,t;
M=read(),N=read();
for(re i=0;i<M;i++)
for(re j=0;j<N;j++)
{
scanf("%d",&t);
corn_state[i]=(corn_state[i]<<1)|!t; //玉米状态取反,0表肥沃
}
x=1<<N;
for(re i=0;cow_state[i]<x;i++) //第一行初始化
if(!(corn_state[0]&cow_state[i])) dp[0][i]=1;
for(re r=1;r<M;r++)
for(re i=0;cow_state[i]<x;i++) //枚举上一行有效状态
{
if(!(corn_state[r-1]&cow_state[i])) //上一行的状态符合上一行的玉米分布
for(re j=0;cow_state[j]<x;j++) //枚举本行有效状态
{
if(!(corn_state[r]&cow_state[j])) //状态符合这本行的玉米分布
if(!(cow_state[i]&cow_state[j])) //这一行和上一行不冲突
dp[r][j]=(dp[r][j]+dp[r-1][i])%MOD;
}
}
int r=M-1;
for(re i=1;cow_state[i]<x;i++) //最后一行
dp[r][0]=(dp[r][0]+dp[r][i])%MOD;
printf("%d\n", dp[r][0]); return 0;
}

【题解】poj 3254 Corn Fields的更多相关文章

  1. 状压DP POJ 3254 Corn Fields

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

  2. poj - 3254 - Corn Fields (状态压缩)

    poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...

  3. poj 3254 Corn Fields

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

  4. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  5. POJ 3254 Corn Fields(状压DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13732   Accepted: 7216 Desc ...

  6. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  7. [ACM] POJ 3254 Corn Fields(状态压缩)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8062   Accepted: 4295 Descr ...

  8. poj 3254 Corn Fields 国家压缩dp

    意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对 ...

  9. POJ - 3254 Corn Fields(状压DP)题解

    思路: 参照blog,用状压DP做,和题解稍微有点不一样,我这里直接储存了状态而不是索引. 这一题的问题是怎么判断相邻不能种,我们用2进制来表示每一行的种植情况.我们将每一行所能够造的所有可能都打表( ...

随机推荐

  1. 如何使用mongo shell

    Cd到MongoDb安装目录到bin目录下,执行mongo命令即可,其他命令参考手册:https://www.runoob.com/mongodb/mongodb-create-collection. ...

  2. Mybatis学习之自定义持久层框架(三) 自定义持久层框架:读取并解析配置文件

    前言 前两篇文章分别讲解了JDBC和Mybatis的基本知识,以及自定义持久层框架的设计思路,从这篇文章开始,我们正式来实现一个持久层框架. 新建一个项目 首先我们新建一个maven项目,将其命名为I ...

  3. JavaWeb——JDBC

    内容索引 1. JDBC基本概念 2. 快速入门 3. 对JDBC中各个接口和类详解 JDBC: 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言 ...

  4. Java安全之Fastjson反序列化漏洞分析

    Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...

  5. MySQL中使用Show Profile

    Show profile 默认是禁用的,用处是记录在服务器中运行的查询耗费的时间和其他一些查询执行状态变更相关的数据. 当前系统是win10,Mysql版本是8.0.15 1.查看当前profilin ...

  6. unbuntu下清理磁盘空间

    把很多大文件删除,并清空回收站后,发现可用存储空间并没增大,如图: 用find /home -size +500k 过滤出大于500k bytes的文件,发现原来删除的yuv文件都被置于.cache目 ...

  7. Spring 实现策略模式--自定义注解方式解耦if...else

    策略模式 定义 定义一簇算法类,将每个算法分别封装起来,让他们可以互相替换,策略模式可以使算法的变化独立于使用它们的客户端 场景 使用策略模式,可以避免冗长的if-else 或 switch分支判断 ...

  8. 057.Python前端Django模型ORM多表查询

    一 基于对象的查询 1.1 一对多查询 设计路由 from django.contrib import admin from django.urls import path from app01 im ...

  9. Linux 目录管理

    tree命令的基本使用 tree 查看当前目录的树状结构 -a 查看所有包含隐藏文件 -L 1 查看目录层级 tree /root 指定目录 根目录下的主要文件 /bin 普通用户可以执行的二进制文件 ...

  10. (转)细说linux挂载

    个人觉得说的很透彻的一篇文章,深入浅出,通俗易懂,把好久之前的一些概念彻底厘清了. 转自https://www.cnblogs.com/ma5on/p/4357625.html 转载的文章不能分类 这 ...