题目链接: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. 第三章(jQuery中的DOM操作)

    3.1 DOM 操作分类 ①DOM Core 包括(getElementById() , getElementsByTagName() , getAttribute() , setAttribute( ...

  2. JavaScript 语言基础

    js语言基础 一 基本知识 UniCode编码 区分大小写(HTML不区分/XHTML区分) Unicode转义序列 \uxxxx (\u加4位16进制表示) 注释 单行注释:// 多行注释:/* * ...

  3. LINQ TO SQL和Entity Framework 的关系 你了解多少?

    1. LINQ  TO SQL  和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist   ...

  4. ABP入门系列(20)——使用后台作业和工作者

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1.引言 说到后台作业,你可能条件反射的想到BackgroundWorker,但后台作业并非是后台 ...

  5. dashDB - Introduction and DB Tools

    dashDB - Introduction dashDB is a database that is designed for performance and scale. It offers sea ...

  6. IT行业歧视40岁以上人群为找工作还要谎报年龄[转]

    IT行业歧视40岁以上人群为找工作还要谎报年龄(这样不好) http://www.aliyun.com/zixun/content/2_6_616161.html [赛迪网讯]4月5日消息,许多40多 ...

  7. js 设置下拉框的默认值

    设置下拉框的默认值,直接在option中增加selected就可以了.但是现在要使用JS来设置它的默认值,代码如下: <select name="aaa" id=" ...

  8. [CF486D]有效集合-树形dp

    Problem 有效集合 题目大意 给出一棵树,求出这棵树的不同联通子节点集合的数量,这些集合必须满足最大权值点减最小权值点小于等于d. Solution 再一次树d乱搞. 因为数据范围贼小,所以我们 ...

  9. JavaScript用typeof判断变量是数组还是对象,都返回object

    在JavaScript中所有数据类型严格意义上都是对象,但实际使用中我们还是有类型之分,如果要判断一个变量是数组还是对象使用typeof搞不定,因为它全都返回object. 使用typeof加leng ...

  10. springJdbc like模糊查询,Spring namedParameterJdbcTemplate like查询

    springJdbc like模糊查询,Spring namedParameterJdbcTemplate like查询, SpringJdbc命名参数like模糊查询,namedParameterJ ...