[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\) . 同时多记录一个每一列中的 ...
随机推荐
- 初识 systemd
从 init 系统说起 linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化.内核初始化的最后一步就是启动 PID ...
- Django学习-21-表关系参数
一对多关系 ForeignKey(ForeignObject) # ForeignObject(RelatedField) to, # 要进行关联的表名 to_field=None, # 要关联的表中 ...
- GitHub 错误解决
1. The file will have its original line endings in your working directory. git config --global core. ...
- hdu5937 Equation
题解其实网上有 突然有点感想 为什么可以用搜索或状压,因为方案数很有限,它要求每种方案不同就意味着搜索的次数也一定,所以现在就应该坚定往这方面想,找部分方案的贪心.这和上一题一样,都是先暴力,后面处理 ...
- css补充
(一)水平对齐1.使用margin属性水平对齐可通过将左和右外边距设置为 "auto",来对齐块元素.除非已经声明了 !DOCTYPE,否则使用 margin:auto 在 IE8 ...
- Android中selector的使用
第一种方法(强烈推荐) 方法:selector做遮罩,原图做background. 我们做按钮的时候经常需要用两个图片来实现按钮点击和普通状态的样式,这就需要提供两种图片,而且每个分辨率下还有多套图片 ...
- js常见排序
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 关于CI框架访问数据库类提示Call to undefined function mysqli_init()
大家好,我曾经是ASP.NET MVC的践行者,现在是PHP,同时也是CodeIgniter框架的初学者和践行者,当时由于项目原因,我被迫给自己打满鸡血,满怀激情的选用Yii2,Lavarel5,Co ...
- 绘制静态地图API-高德地图
1 高德静态地图链接 http://lbs.amap.com/api/webservice/guide/api/staticmaps 2 /** * User: [一秋] * Date: 2017/9 ...
- 获取SHA1
进入命令行,依次输入: 此处密钥默认为android.