[ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意:
有一块n*m的土地
0代表不肥沃不可以放牛 1代表肥沃可以放牛
且相邻的草地不能同时放牛
问最多有多少种放牛的方法并对1e8取模
思路:
典型的状压dp 能状态压缩 能状态转移
能状态压缩的题的特点就是只有两种状态
所以用0 1表示两种状态 用位运算判断是否符合条件
然后将前一行的合理状态转移到后一行
最后统计最后一行的状态
dp[i][j]代表第i行以第j种状态放牛时有多少种不同的状态
(c++的语言特性是 封装 继承 多态~)
/* ***********************************************
Author :Sun Yuefeng
Created Time :2016/10/31 17:59:53
File Name :C.cpp
************************************************ */ #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<bitset>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<queue>
#include<list>
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=<<;
const int mod=1e8;
int dx[]= {,,,-,,-,,-};
int dy[]= {,-,,,-,,,-}; int _map[maxn]; //记录给出的每块地的状态
int st[maxn]; //记录每一行的状态
int dp[][maxn]; bool judge(int x) //判断相邻两位是否同时为1
{
return (x&(x<<));
} bool judge(int x,int y) //判断两位是否同时为1
{
return _map[x]&st[y];
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m;
while(cin>>n>>m){
int x;
M(dp,),M(_map,),M(st,);
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>x;
if(!x)
{
_map[i]+=(<<j); //向图中添加空地
}
}
}
int k=;
for(int i=;i<(<<m);i++) //初始化能不能以i状态放牛
{
if(!judge(i))
{
st[k++]=i;
}
}
for(int i=;i<k;i++) //初始化第一行状态
{
dp[][i]=(!judge(,i));
}
for(int i=;i<n;i++)
{
for(int j=;j<k;j++)
{
if(judge(i,j)) continue; //判断第i行是否能以j的方式放牛
for(int l=;l<k;l++)
{
if(judge(i-,l)) continue; //判断上一行状态
if(!(st[j]&st[l])) //符合题意转移状态
dp[i][j]+=dp[i-][l];
}
}
}
int ans=;
for(int i=;i<k;i++)
{
ans+=dp[n-][i];
ans%=mod;
}
cout<<ans<<endl;
}
return ;
}
[ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp的更多相关文章
- 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入门题,将可以种菜的状态用一个数的二进制表 ...
- Poj - 3254 Corn Fields (状压DP)(入门)
题目链接:https://vjudge.net/contest/224636#problem/G 转载于:https://blog.csdn.net/harrypoirot/article/detai ...
- poj 3254 Corn Fields 状压dp入门
题目链接 题意 在\(M\times N\)的\(0,1\)格子上放东西,只有标记为\(1\)的格子可以放东西,且相邻的格子不能同时放东西.问有多少种放法. 思路 参考:swallowblank. \ ...
- 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 (状压入门)
Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M≤ 12; 1 ≤ N ≤ 12) ...
- 【POJ3254】Corn Fields 状压DP第一次
!!!!!!! 第一次学状压DP,其实就是运用位运算来实现一些比较,挺神奇的.. 为什么要发“!!!”因为!x&y和!(x&y)..感受一下.. #include <iostre ...
- [USACO06NOV]玉米田Corn Fields 状压DP
题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的 ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
随机推荐
- MKNetworkKit 使用
关于ios 网络请求之MKNetworkKit库的使用 项目导入MK库之后,还需要导入三个框架文件: SystemConfiguration.framework CFNetwork.framework ...
- vs2015开发Windows服务
工作已经很久,时隔这么长时间写这篇文章是给自己以后做参考.也不至于以后长时间不写Windows服务而忘记整个开发过程.windows服务开发,基础的就不说了,直接上过程. 1.新建windows服务项 ...
- 广告频次控制(frequency capping)
频次控制介绍 广告中的频次控制是指控制一个用户最多在指定时间内看到一个广告(或相似广告)的次数,比如广告主可以限制一个用户最多只能一天看到一个广告3次(频次控制也可以让publisher来指定,但本文 ...
- python 提供INI配置文件的操作 ConfigParser
原文地址:http://www.cnblogs.com/pumaboyd/archive/2008/08/11/1265416.html 红色的为标注信息 +++++++++++++++++引用+++ ...
- iOS学习笔记(十六)——数据库操作(使用FMDB)
iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...
- 通过Shell脚本读取properties文件中的参数时遇到\r换行符的问题
今天在编写微服务程序启动脚本的时候,遇到一个比较奇葩的问题,下面给出具体描述: 目标:通过读取maven插件打包时生成的pom.properties文件,获取里面的应用名称和应用版本号,然后拼接得到s ...
- Springmvc中配置Quartz使用,实现任务实时调度。
菜鸡的自我修炼,第一次接触quartz,做个记录.-------jstarseven 最近在项目中,第一次在springmvc中配置实用quartz,深刻的感受到quartz带来的方便,顺手做个记录. ...
- 编译 MVC View
默认MVC的 View页面 不参与编译,当更改view对应model后,view编译也能通过,或者页面有错误的服务端代码时也不会报错. 那么如何在编译的时候能让View中的错误也不能通过呢.经过查找找 ...
- python之路 - 基础3
1.字符串处理 name = "my name is jiachen" #首字母大写 print (name.capitalize()) #统计字母出现次数 print (name ...
- java基础练习 3
import java.util.Scanner; public class Third { /*计算字符串中子串出现的次数 (5 分数)*/ public static void main(Stri ...