【状压基础题】poj3254 Corn Fields

题目大意 :农夫约翰有n*m块地,其中一些地荒掉了。玉米是一种傲娇的植物,种在相邻的地里会导致不孕不育。求所有种法数对100000000求余。
读入:第一行一个n一个m,
接下来是一个n行m列的矩形,表示田地的状态(1表示可种植,0表示不可种植)
输出:一个整数,表示总的方法数 % 1000000000的结果
首先我们把原图的每一行转成二进制数存储(此处及以下原图均指读入的田地状况),1表示可以种植,0表示不能种植
以行为阶段,对于每一行,我们把可以种的标记为1,不能种则标记为0
分析同一行中,我们由题目可以知道,两个1肯定不相邻,
我们想把当前状态左移1位再与原数相&,若结果不为0,则肯定有两个1相邻了
但是同样我们要注意的是,两行之间相邻也是不允许的
例如:
0001010
0001001
第一行第4个位置为1,下一行第4个位置仍为1,上下两个1相邻了,这样也是不允许的
这样我们设一个状态为k,由状态k转移到状态j,若j&k!=0,则出现了上下两个1相邻,这样是不符合的
接着我们必须符合原图,也就是原图中不能种的地方我们一定不能种,原图中不能种的地方为0,能种的地方为1
但是比较麻烦的是,原图能种的地方我们不一定种,原图不能种的地方,在我们的状态中可能种,我们没办法区分这两种情况
那么我们试着翻转一下操作
存原图时,我们用0表示能种,1表示不能种(最初我们用1表示能种,0表示不能种)
这样我们可以直接相&,若出现了1,则一定不能种。因为此时我们标记为1的位置,按照题目要求,在原图中一定要标记为0,如果某个位置我们种了而原图中
不能种,那么相&得到的就是1,这样是不行的。问题就解决了。
然后我们可以以非常显然的方式得到dp数组
f[i, j]表示在第i行(i为一个m位的二进制数),状态为j时,所有的种法,这样得到的状态转移方程就是:
f[i, j] = Σf[i - 1, k]( j & k == 0 && j & a[i] == 0 && k & a[i - 1] == 0)
初态:f[0, 0] = 1;
目标:Σ{f[n, i]}(i为m位二进制数,0 <= i < 1 << m)
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define ll long long
using namespace std;
const int mod = ;
int n, m, h;
ll f[][ << ], ans = ;
ll a[]; inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return x * y;
} int main() {
n = read(), m = read();
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j) {
h = read();
a[i] <<= ;
a[i] += (h == ) ? : ;
}
f[][] = ;
for(int i = ; i <= n; ++i)
for(int j = ; j < << m; ++j) {
if(j & (j << ) || j & a[i]) continue;
for(int k = ; k < << m; ++k) {
if(j & k || k & a[i - ] || k & (k << )) continue;
f[i][j] = (f[i][j] + f[i - ][k]) % mod;
}
}
for(int i = ; i < << m; ++i)
ans = (ans + f[n][i]) % mod;
cout << ans << '\n';
return ;
}
【状压基础题】poj3254 Corn Fields的更多相关文章
- 【状压DP】poj3254 Corn Fields
题意: 一块n*m的田,1表示这个地方可以种植,0代表这个地方不能种植.植物种植还必须满足两株植物不能相邻(横竖都不行).问共有几种种植方法,而且当什么都不种时认为是一种方法. 解题思路: 种植用1表 ...
- 状压DP POJ 3254 Corn Fields
题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...
- 状压 DP:[USACO06NOV] Corn Fields,[USACO13NOV] No Change
[USACO06NOV] Corn Fields (试题来源:Link ) 题目描述 Farmer John has purchased a lush new rectangular pasture ...
- poj3254 Corn Fields 利用状态压缩求方案数;
Corn Fields 2015-11-25 13:42:33 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10658 ...
- poj3254 Corn Fields (状压DP)
http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- POJ3254 Corn Fields(状压DP)
题目给个n×m的地图,1可以放玉米0不可以,现在要放玉米,玉米上下左右不能相邻,问放法有几种. 当前一行的决策只会影响下一行,所以状压DP之: dp[i][S]表示前i行放完且第i行放玉米的列的集合是 ...
- poj3254 Corn Fields
orn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17989 Accepted: 9474 Descr ...
- 【原创】【状态压缩DP】POJ3254 Corn Fields【新手向】
一开始根本不会状压dp,上网各种找题解,但发现他们写的都很......反正我作为一个没有接触过状态压缩的,根本看不懂! 然后看了好多状态压缩的题的题解,总结了一下思路,思路很重要,有了思路转换成计算机 ...
- POJ 2923 状压好题
Relocation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2631 Accepted: 1075 Descri ...
随机推荐
- 几个JavaScript的浏览器差异处理问题
JQuery确实是个很好用的库,你可以不用考虑很多细节方面的事情.但很作为一个web前端,处理和了解浏览器差异一个重要问题.下面将介绍一些总结,先介绍没有使用js库的情况. 1. setAttribu ...
- taotao订单系统
taotao订单系统需求分析.注意点.代码 需要注意的地方: 1.下订单功能一定要使用关系型数据库,因为其设计到钱,而noSql数据库相比来说丢失数据的风险更大. 但是查看订单列表.查看订单详情等功能 ...
- bzoj1814 Ural 1519 Formula 1(插头dp模板题)
1814: Ural 1519 Formula 1 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 924 Solved: 351[Submit][Sta ...
- Java之戳中痛点 - (2)取余用偶判断,不要用奇判断
取余判断原则:取余用偶判断,不要用奇判断 先看一个 程序: package com.test; import java.util.Scanner; public class t1 { public s ...
- javascript中arguments的应用——不定项传参求和
<script type="text/javascript"> window.onload=function(){ function sum(){ var result ...
- oracle11g 使用数据泵导出导入数据
终于搞定了 快写个笔记 记录下. 删除用户的时候提示已经登录了不能删除,这个需要把登录的session结束掉. select username,sid,serial# from v$session w ...
- bzoj 2005 NOI 2010 能量采集
我们发现对于一个点(x,y),与(0,0)连线上的点数是gcd(x,y)-1 那么这个点的答案就是2*gcd(x,y)-1,那么最后的答案就是所有点 的gcd值*2-n*m,那么问题转化成了求每个点的 ...
- linux基础之nginx和nfs服务
第一部分: 一.nginx服务安装nginx包(源码安装)1.先cd /etc/yum.repos.d目录下2.yum install epel-release -y(安装扩展包)3.yum in ...
- HDU1281(二分图最大匹配,棋盘建图,找关键点)
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- UVA 10303 How Many Trees? (catlan)
刚开始没看出时卡特兰数列.直接套高精度版 #include <map> #include <set> #include <list> #include <cm ...