[poj3254]Corn Fields_状压dp
Corn Fields poj3254
题目大意:给你一个n*m的地,每一块地可以种或不种,两块种过的地不能挨着,可以一块都不种,问所有的种地方案数。
注释:读入用0和1,1<=n,m<=12.
想法:这题和炮兵阵地特别像,比炮兵更简单。我们再度入的时候直接处理出当前行的地的不可种的情况。预处理出一行如果都能种的话所可能的方案数。此处需要满足的就是两块地不能挨着,通过打表我们可以发现这种情况最多只有377种情况(我们附上打表用的程序)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool check(int x)//判断当前状态是否可行
{
if(x&(x<<1)) return false;
return true;
}
int cnt;
void before(int mid)//处理所有状态
{
for(int i=0;i<(1<<mid);i++)
{
if(check(i)) cnt++;
}
}
int main()
{
int n;
cin >> n;
before(n);
printf("%d\n",cnt);//输出所有可行状态数
return 0;
}
然后,我们先预处理出第一行,怎么处理呢?其实map是0的情况,也就是读入数据的反码。我们对于一个状态只需要通过&上map对应的下标就可以判断当前数据是否合法。如果合法,dp[1][i]就是1。其中,dp[i][j]表示第 i 行状态为 j ,前 i 行能填充的方案数。转移时,我们通过外层松弛行数,内层枚举所有状态,用&判断即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 1000000000
using namespace std;
int dp[15][380];
int map[15];//存储的是反码
int str[380];//存储所有状态
// int sum[350];
int cnt;//状态数目
bool check(int x)//判断当前状态是否可行
{
if(x&(x<<1)) return false;
return true;
}
// int getSum(int x)
// {
// int ans=0;
// while(x>0)
// {
// if(x&1) ans++;
// x>>=1;
// }
// return ans;
// }
void before(int mid)//预处理所有状态
{
for(int i=0;i<(1<<mid);i++)
{
if(check(i))
{
str[++cnt]=i;
// sum[cnt]=getSum(i);
}
}
}
int main()
{
int n,m;
cin >> n >> m;
int a;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d", &a);
if(a==0) map[i]|=(1<<(j-1));//运用|运算的性质来构造反码
}
}
before(m);//预处理
// cout << "cnt = " << cnt << endl;
for(int i=1;i<=cnt;i++)
{
if(!(str[i] & map[1]))
{
dp[1][i]=1;
}
}
// for(int i=1;i<=n;i++) printf("%d ",map[i]);
// puts("");
// for(int i=1;i<=cnt;i++) printf("%d ",dp[1][i]);
// puts("");
for(int i=2;i<=n;i++)//转移
{
for(int j=1;j<=cnt;j++)//枚举i的状态
{
if(str[j] & map[i]) continue;//判断状态是否合法
for(int k=1;k<=cnt;k++)//枚举i-1的状态
{
if(str[k] & map[i-1]) continue;
if(str[j] & str[k]) continue;
dp[i][j]+=dp[i-1][k];
}
}
}
int ans=0;
for(int i=1;i<=cnt;i++)
{
if(map[n]&str[i]) continue;
ans+=dp[n][i];
ans%=mod;//重要,不加luogu会WA 10%
}
printf("%d\n",ans);
return 0;
}
小结:第2道状压。调试时候不要忘记题目所求的,在发现一个题与另一个题相似时不要被另一道题所局限
[poj3254]Corn Fields_状压dp的更多相关文章
- 【POJ3254】Corn Fields 状压DP第一次
!!!!!!! 第一次学状压DP,其实就是运用位运算来实现一些比较,挺神奇的.. 为什么要发“!!!”因为!x&y和!(x&y)..感受一下.. #include <iostre ...
- POJ 1684 Corn Fields(状压dp)
描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
- POJ 3254 Corn Fields (状压dp)
题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...
- poj3254:基础状压dp
第二个状压dp 做过的第一个也是放牛问题,两头牛不能相邻 这个题多了一个限制,就是有些位置不能放牛 于是先与处理一下每一行所有不能放牛的状态,处理的过程直接对每一个不能放牛的状态或以下 ac代码: # ...
- [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...
- P1879 [USACO06NOV]玉米田Corn Fields 状压dp/插头dp
正解:状压dp/插头dp 解题报告: 链接! ……我真的太菜了……我以为一个小时前要搞完的题目调错误调了一个小时……90分到100我差不多搞了一个小时…… 然后这题还是做过的……就很气,觉得确实是要搞 ...
- [USACO06NOV]玉米田Corn Fields 状压DP
题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的 ...
- [USACO06NOV]玉米田Corn Fields (状压$dp$)
题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 块草皮,且最后一位状态为 \(k\) . 同时多记录一个每一列中的 ...
随机推荐
- hi3531的pcie atu资源重映射
1. 设置ATU 区域号寄存器为需要配置的地址转换区编号. 2. 设置ATU Region Lower Base Address Register 和ATU Region Upper Base Add ...
- Netty未来展望
作为<Netty权威指南(第2版)>的结尾章节,和读者朋友们一起展望下Netty的未来. 1应用范围 随着大数据.互联网和云计算的发展,传统的垂直架构逐渐将被分布式.弹性伸缩的新架构替代. ...
- 获取Filter的三种途径
一.通过CLSID [cpp] view plaincopyprint? IBaseFilter *pF = 0; HRESULT hr = CoCreateInstance(clsid, 0, CL ...
- val(),text(),html()的区别
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script> ...
- 阿里云ECS+CentOS 7.0+Docker+Redmine环境搭建
前言 搭建Redmine环境可以选择使用分别安装Ruby+Rails+Redmine+MySQL的方式, 但是过程中需要解决各种扰人的依赖问题.Docker为我们提供的Plan B,方便,快捷. 安装 ...
- CSS3 column属性
css3 column属性的应用 1.案例源码 <!DOCTYPE html><html lang="en"><head> <meta c ...
- Postgresql基本用法以及优化注意
本篇为之前学习PG数据库一些基本操作使用以及优化注意. 比较运算符 = : <>,!=,<= , <,>=,>: 不能用于null判断; Between: Le ...
- Apace Ignite剖析
1.概述 Apache Ignite和Apache Arrow很类似,属于大数据范畴中的内存分布式管理系统.在<Apache Arrow 内存数据>中介绍了Arrow的相关内容,它统一了大 ...
- 清橙A1212:剪枝
题面 清橙 Sol 一种新的树上\(DP\)姿势 从左往右按链\(DP\) 做法: 维护两个栈\(S1\),\(S2\) \(S1\)存当前的链 \(S2\)存分叉点以下要改的链 \(Dfs\),弄一 ...
- BSGS算法(大步小步算法)
计算\(y^x ≡ z \ mod\ p\) 中 \(x\) 的解. 这个模板是最小化了\(x\) , 无解输出\(No \ Solution!\) map<ll,ll>data; ll ...