题目链接:http://poj.org/problem?id=3254

题意:

  给你一片n*m的耕地,你可以在上面种玉米。但是其中有一些地方是荒芜的,不能种植。并且种植玉米的地方不能相邻。问你在这片地上有多少种种植方案。

题解:

  思路:一行一行种

  状态表示:

    dp[state][i] = num of ways at ith row

    (1)当前种到了第i行

    (2)第i行有哪些地方种了玉米,状态为state

  如何转移:

    约束条件:

      (1)对于当前行,已经在某些地方种过了玉米,那么在下一行的对应位置就不能再种。

      (2)在每一行内部,种植玉米不能相邻。

      所以可以预处理(dfs)出在一行上每一种state对应的下一行可以种的方案nex。

    转移条件:

      (1)state在当前第i行合法。

      (2)state对应的nex在i+1行合法。

      所以在读入的时候,就可以预处理出每一行土地的情况field[i]。二进制下每一位0代表可以种,1代表不能种。

      以上两个条件就变成了:(state&field[i])==0 和 (nex&field[i+1])==0

    转移:

      三重for循环,枚举种到第i行、当前行的种植方案state、state对应的下一行的种植方案nex。

      dp[state|nex][i+1] += dp[state][i]

AC Code:

 // optimizations:
// 1) a state is legal at a row only if: state&field == 0
// 2) preprocess the states can be transfered from another state #include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 15
#define MAX_S (1<<14)
#define MOD 100000000 using namespace std; int n,m;
int ans;
int field[MAX_N];
int dp[MAX_S][MAX_N];
vector<int> transfer[MAX_S]; void read()
{
memset(field,,sizeof(field));
cin>>n>>m;
int temp;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>temp;
field[i]<<=;
field[i]|=(!temp);
}
}
field[n]=(<<m)-;
} void dfs(int col,int state,int nex)
{
if(col>=m)
{
transfer[state].push_back(nex);
return;
}
if(!((state>>col)&)) dfs(col+,state,nex|(<<col));
dfs(col+,state,nex);
} void solve()
{
for(int state=;state<(<<m);state++)
{
dfs(,state,);
}
memset(dp,,sizeof(dp));
for(int i=;i<transfer[].size();i++)
{
int state=transfer[][i];
if(!(field[]&state)) dp[state][]=;
}
for(int i=;i<n;i++)
{
for(int state=;state<(<<m);state++)
{
if(dp[state][i]!= && !(field[i]&state))
{
for(int j=;j<transfer[state].size();j++)
{
int nex=transfer[state][j];
if(!(field[i+]&nex))
{
dp[nex][i+]+=dp[state][i];
dp[nex][i+]%=MOD;
}
}
}
}
}
} void print()
{
cout<<dp[][n]<<endl;
} int main()
{
read();
solve();
print();
}

POJ 3254 Corn Fields:网格密铺类 状压dp的更多相关文章

  1. POJ 2411 Mondriaan's Dream:网格密铺类 状压dp

    题目链接:http://poj.org/problem?id=2411 题意: 给你一个n*m的网格 (1<=n,m<=11) ,往里面铺1*2或2*1的砖块,问你铺完这个网格有多少种不同 ...

  2. poj 2411 Mondriaan's Dream 骨牌铺放 状压dp

    题目链接 题意 用\(1\times 2\)的骨牌铺满\(H\times W(H,W\leq 11)\)的网格,问方案数. 思路 参考focus_best. 竖着的骨牌用\(\begin{pmatri ...

  3. bzoj 1725: [Usaco2006 Nov]Corn Fields牧场的安排【状压dp】

    压一维状态,转移时把符合条件的上一行加上 #include<iostream> #include<cstdio> using namespace std; const int ...

  4. 状压DP POJ 3254 Corn Fields

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

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

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

  6. poj 3254 Corn Fields

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

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

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

  8. POJ 3254 Corn Fields (状压dp)

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

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

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

随机推荐

  1. Linux系统网卡设置

    由于做了虚拟机的克隆,发现克隆机和被克隆机的MAC地址相同了,下面我将要介绍一下linux中网卡的配置步骤,我使用的linux是CentOS release 6.9 (Final) 1.root用户编 ...

  2. Java多线程(一) —— 线程的状态详解

    一.多线程概述  1. 进程 是一个正在执行的程序.是程序在计算机上的一次运行活动. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 系统以进程为基本单位进行系统资源的调度 ...

  3. 使用Gulp实现前端构建自动化

    使用Gulp实现前端构建自动化 安装 一.安装NodeJs Gulp的安装依赖于NodeJs的npm安装管理器 安装包下载地址 关于npm命令: 1. npm install <name> ...

  4. JDBC01 利用JDBC连接数据库【不使用数据库连接池】

    目录: 1 什么是JDBC 2 JDBC主要接口 3 JDBC编程步骤[学渣版本] 5 JDBC编程步骤[学神版本] 6 JDBC编程步骤[学霸版本] 1 什么是JDBC JDBC是JAVA提供的一套 ...

  5. Japanese Learning - 五十音图

    平假名: 片假名: あ い う え お ア イ ウ エ オ か き く け こ カ キ ク ケ コ さ し す せ そ サ シ ス セ ソ た ち つ て と        タ チ ツ テ ト な に ...

  6. maven 打包时mapper.xml打不进去问题

    首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...

  7. JavaScript中判断鼠标按键(event.button)

    <div id="test"></div> <script> document.oncontextmenu=function(){ return ...

  8. 用jQuery动态添加小广告

    网站的时候,有些网站总是在右下角,左上角或者其他地方投放广告. 我用jQuery试着自己做了一个,代码如下,如有不对的地方请各位不吝赐教 <!DOCTYPE html> <html ...

  9. python全栈阶段测试(一)

    1.执行Python脚本的两种方式 如果想要永久保存代码,就要用文件的方式 如果想要调试代码,就要用交互式的方式 2.Pyhton单行注释和多行注释分别用什么? 单行注释:# 多行注释: '' &qu ...

  10. Java条件查询涉及到时分秒

    关于Oralce数据库 的日期时间查询: 下面我们先来看一组日期数据 表:myDate 列:time; 1998-8-7 23:45:33.3 1998-8-7 11:22:21.5 1998-8-7 ...