【状压基础题】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 ...
随机推荐
- ARC078 D.Fennec VS. Snuke(树上博弈)
题目大意: 给定一棵n个结点的树 一开始黑方占据1号结点,白方占据n号结点 其他结点都没有颜色 每次黑方可以选择黑色结点临近的未染色结点,染成黑色 白方同理. 最后谁不能走谁输. 题解: 其实简单想想 ...
- WIndows 相关知识
Windows服务 图解WinXP局域网共享设置步骤 Win10如何搭建FTP服务器以实现快速传输文件 强大工具psexec工具用法简介 BIOS和CMOS的区别 系统CLSID简介和小技巧
- ar用法小记
ar是用来创建.修改或者从档案文件中提取的GNU程序,它被认为是一个二进制的工具,因为它最大的应用就是将一些子程序归档为库文件. 用法概述 ar [-]p[mod [relpos] [count]] ...
- MySQL使用笔记(一)安装配置
By francis_hao Nov 27,2016 一般软件的安装都是可以通过源码和安装包安装,源码安装可配置性好些,安装包安装比较省事,况且使用yum也可以解决依赖的问题,基本实现了一键 ...
- hadoop SecondNamenode 详解
SecondNamenode名字看起来很象是对第二个Namenode,要么与Namenode一样同时对外提供服务,要么相当于Namenode的HA. 真正的了解了SecondNamenode以后,才发 ...
- 用filters定制化spring的包扫描
Fiter的信息如下: Filter的类型有:annotation(这是spring默认的),assignable,aspectj, regex,custom 首先看一下我这个demo的目录结构: 上 ...
- 旋转数组 [ LeetCode ]
原题地址:https://leetcode-cn.com/problems/rotate-array/description/ 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...
- com.mongodb.MongoException$CursorNotFound: cursor not found on server异常处理
java链接MongoDB处理大量数据时经常碰到cursor not found 的异常,其实是超时所致 Exception in thread "main" com.mongod ...
- RPC-Thrift(二)
TTransport TTransport负责数据的传输,先看类结构图. 阻塞Server使用TServerSocket,它封装了ServerSocket实例,ServerSocket实例监听到客户端 ...
- 知问前端——日历UI(三)
datepicker日期选择选项 属性 默认值/类型 说明 minDate 无/对象.字符串或数值 日历中可以选择的最小日期 maxDate 无/对象.字符串或数值 日历中可以选择的最大日期 defa ...