题目链接: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. alive pdf 基本用法

    alive pdf 基本用法 <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplic ...

  2. [jbdj]SpringMVC框架(3)映射器

    映射器:什么样的请求交给Action. 1} class  :  BeanNameUrlHandlerMapping  要掌握, 将程序员定义的Action所对应的<bean>标签的nam ...

  3. Javassist进行方法插桩

    javassist官网 http://jboss-javassist.github.io/javassist/ javassist API网 http://jboss-javassist.github ...

  4. ArcGisEngine图层操作(随笔,不全)

    1.加载图层: 1.1 object.AddLayer(Layer[,toindex=0]) Layer表示ILayer对象,必选,toIndex参数表示图层索引(长整型),没需求可以忽略. 1.2 ...

  5. C++学习(三)入门篇——函数

    C++函数分两种:有返回值的和没返回值的 1.有返回值的函数 调用函数流程 如图,sqrt(6.25)为函数调用,被调用的函数叫做被调用函数,包含函数调用的函数叫做调用函数. 参数是发送给函数的信息, ...

  6. neo4j 数据库导入导出

    工作中需要将 A 图数据库的数据完全导出,并插入到 B 图数据库中.查找资料,好多都是通过导入,导出 CSV 文件来实现.然而,经过仔细研究发现,导出的节点/关系 都带有 id 属性 ,因为 A B ...

  7. 使用java语言编写窗口按钮

    使用java语言编写窗口按钮 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import ja ...

  8. 微信小程序探索(一)

    一.小程序到底是个什么鬼? 现在Android系统越用越卡的现状很头疼,手机上再也不想装太多的App,而市面上层出不穷的各种应用,有时又是我们需要用到的,怎么办呢!!微信小程序就是一种不需要下载安装即 ...

  9. poj_1679: The Unique MST【次小生成树】

    题目链接 参考博客 希望注释足够清楚..欢迎指出不足~ #include<cstdio> #include<cstring> #include<algorithm> ...

  10. Multimodal —— 看图说话(Image Caption)任务的论文笔记(三)引入视觉哨兵的自适应attention机制

    在此前的两篇博客中所介绍的两个论文,分别介绍了encoder-decoder框架以及引入attention之后在Image Caption任务上的应用. 这篇博客所介绍的文章所考虑的是生成captio ...