[ACM] POJ 3254 Corn Fields(状态压缩)
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 8062 | Accepted: 4295 |
Description
Farmer John has purchased a lush new rectangular pasture composed of M by
N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares are infertile and can't be planted. Canny FJ knows that the cows dislike eating close
to each other, so when choosing which squares to plant, he avoids choosing squares that are adjacent; no two chosen squares share an edge. He has not yet made the final choice as to which squares to plant.
Being a very open-minded man, Farmer John wants to consider all possible options for how to choose the squares for planting. He is so open-minded that he considers choosing no squares as a valid option! Please help Farmer John determine the number of ways
he can choose the squares to plant.
Input
N
Lines 2..M+1: Line i+1 describes row i of the pasture with
N space-separated integers indicating whether a square is fertile (1 for fertile, 0 for infertile)
Output
Sample Input
2 3
1 1 1
0 1 0
Sample Output
9
Hint
1 2 3
4
There are four ways to plant only on one squares (1, 2, 3, or 4), three ways to plant on two squares (13, 14, or 34), 1 way to plant on three squares (134), and one way to plant on no squares. 4+3+1+1=9.
Source
解题思路:
题意为有n行m列的长方形,分成n*m个格子,每一个格子标记为0或1,在这些格子里面放牛,当中1代表该格子能够放牛,0代表不能放牛,且相邻的两个格子不能同一时候有牛。问总的方案数。
思想为状态压缩。把每一行放牛的状态看作一个二进制数,dp[i][j]表示第i行状态为j时前i行共同拥有的方案数。
代码:
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int mod=100000000;
const int maxn=12;
int dp[maxn+1][(1<<maxn)+1];
int num[maxn+1];
int n,m; bool check(int i,int x)//检查第i行出现状态x是否合法
{
if((x&num[i])!=x)//非常巧妙,推断第i行出现的状态x是否合法,为什么这么写。由于0的地方不能放牛。
//合法状态与原始状态0位且为0,原始状态1位的地方与合法状态相应位且都等于合法状态位上的数字
return 0;
if(x&(x>>1)||x&(x<<1))//不能有相邻的两个1
return 0;
return 1;
} int main()
{
cin>>n>>m;
int x;
memset(num,0,sizeof(num));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>x;
if(x)
num[i]=num[i]|(1<<(j-1));//把每一行的状态保存到num[i]中去
}
int Max=(1<<m);
dp[0][0]=1;//注意这一句啊! for(int i=1;i<=n;i++)//枚举每一行
{
for(int j=0;j<Max;j++)
{
if(!check(i,j))
continue;
for(int k=0;k<Max;k++)
if((j&k)==0)
{
dp[i][j]+=dp[i-1][k];
if(dp[i][j]>=mod)
dp[i][j]%=mod;
}
}
}
int ans=0;
for(int i=0;i<Max;i++)
{
ans+=dp[n][i];
if(ans>=mod)
ans%=mod;
}
cout<<ans;
return 0;
}
[ACM] POJ 3254 Corn Fields(状态压缩)的更多相关文章
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- POJ 3254 Corn Fields 状态压缩DP (C++/Java)
id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...
- POJ 3254 Corn Fields (状态压缩DP)
题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...
- POJ 3254 Corn Fields状态压缩DP
下面有别人的题解报告,并且不止这一个状态压缩题的哦···· http://blog.csdn.net/accry/article/details/6607703 下面是我的代码,代码很挫,绝对有很大的 ...
- POJ 3254 Corn Fields 状态压缩
这题对我真的非常难.实在做不出来,就去百度了,搜到了一种状压DP的方法.这是第一种 详细见凝视 #include <cstdio> #include <cstring> #in ...
- poj - 3254 Corn Fields (状态压缩dp入门)
http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...
- poj 3254 Corn Fields 国家压缩dp
意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对 ...
- poj 3465 Corn Fields 状态压缩
题目链接:http://poj.org/problem?id=3254 #include <cstdio> #include <cstring> #include <io ...
随机推荐
- 墙体裂缝推荐的情况下驱动的PhoneGap入门,早看早收据
清华大学出版社推出<构建跨平台APP:PhoneGap移动应用实战> 零门槛的学习APP发展 刮 进步 20以上示范样本APP 3项目APP 台à跨终端à移动开发 完美生命周期:搭建好开发 ...
- SQL Server Database 维护计划创建一个完整的备份策略
SQL Server维护计划Maintenance Plan这是一个非常有用的维护工具,能够完成大部分的数据库维护任务,通过这些功能包.您可以省略大量的编码时间. 介绍的不是非常多,特此补上一篇 ...
- VB.NET版机房收费系统---导出Excel表格
datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,能够显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件很easy和直观,大多数情 ...
- hdu2126(求方案数的01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数. 分析:一看 ...
- 项目中那些事|ListView中嵌套ListView问题
要在一个ListView中放入另一个ListView,也即在一个ListView的每个 item 中放入另外一个ListView.但刚开始的时候,会发现放入的子ListView会显示不完全(我这里只显 ...
- const void *a 与 void *const a 的差别
const void *a 这是定义了一个指针a,a能够指向随意类型的值,但它指向的值必须是常量. 在这样的情况下,我们不能改动被指向的对象,但能够使指针指向其它对象. 比如: const void ...
- Effective C++ 条款24
若全部參数皆需类型转换,请为此採用non-member函数 我们直奔主题 假设你定义一个有理数类例如以下 class Rational{ public: Rational(int numerator= ...
- 微通道对接ERP、CRM、OA、HR、SCM、PLM和其他管理系统解决方案
公司现有ERP.CRM.OA.HR.SCM.PLM等管理系统的对接微信公共平台服务 方法1:开放接口 企业开放现有系统数据接口给第三方,或由第三方开发数据接口对接微信公众平台 方法2:获取数据库 企业 ...
- linux进程解析--进程的退出及销毁
一进程的退出: 当一个进程运行完毕或者因为触发系统异常而退出时,最终会调用到内核中的函数do_exit(),在do_exit()函数中会清理一些进程使用的文件描述符,会释放掉进程用户态使用的相关的物理 ...
- poj3126解题报告
题意:简单的说就是:有一个人门牌号是一个四位数的整数,并且还是一个素数,现在他想要换成另外一个四位数且是素数的门牌号,而且,每次都只能更换这个四位数的一个位置的数 ,也就是每换一次都只改变一个数字,而 ...