POJ 3254 状压DP
题目大意: 一个农民有一片n行m列 的农场 n和m 范围[1,12] 对于每一块土地 ,1代表可以种地,0代表不能种。 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边。 告诉你 n ,m 和那些地方能种菜哪些地方不能种菜,求农夫一共有多少种方案种菜
解法:
基本思想是状压 也就是用一个int 型的数代表一行的种菜策略,二进制的0代表该位不能种菜,1位代表能种菜,使用位运算使处理速度变快
对于单行行,最多有2^12 种情况,并且 2^12种情况里面还有很多不满足题意的 筛选一下每行最多有400左右种情况,
1 先筛选出每行满足题意的情况
2 如何判断两行能否相邻? 如果一行状压的数使 i 另一行状压的数是 j 如果 i|j ==i+j 说明两行可以相邻
3 如何判断一个种法能否满足某一行的要求?
以样例来看
2 3
1 1 1
0 1 0
第一行二进制是7 第二行二进制是2
如果一个种菜的决策时 i 如果 i|2==2 就说明他能满足第二行的要求,,
然后就是dp[i][k] 代表第i行像k这样种菜的情况数
然后就是渣渣参考代码 g++
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <string>
#include <queue>
#include <cstring>
#define CL(a,b) memset(a,b,sizeof(a))
#define ll __int64
#define TEST cout<<"TEST ***"<<endl;
#define INF 0x7fffffff
#define MOD 100000000
using namespace std; ll dp[][];
int inn[],m,n;
int num[]; int initinn()
{
int i,j,preinn,nowinn,taginn;
CL(inn,);
for(i=;i<;i++)
{
preinn=,taginn=;
j=i;
while(j)
{
nowinn=j&;
if(nowinn==&&preinn==)
{
taginn=;
break;
}
preinn=nowinn;
j/=;
}
inn[i]=taginn;
}
i=;j=;
while(j<)
{
if(inn[j]==)
{
inn[i++]=j;
}
j++;
}
return i;
} using namespace std; int main()
{
initinn();
while(scanf("%d %d",&n,&m)!=EOF)
{
int i,j,k,ma=(<<m)-;
int a,sum;
CL(dp,);
for(i=;i<=n;i++)
{
sum=;
for(j=;j<m;j++)
{
scanf("%d",&a);
sum*=;
sum+=a;
}
num[i]=sum;
}
dp[][]=;
for(i=;i<=n;i++)
{
for(j=;inn[j]<=ma;j++)
{
if((inn[j]|num[i])!=num[i])continue;
for(k=;inn[k]<=ma;k++)
{
if((inn[j]|inn[k])==inn[j]+inn[k])
{
dp[i][j]+=dp[i-][k];
dp[i][j]%=MOD;
}
}
}
}
ll rem=;
for(i=;inn[i]<=ma;i++)
{
rem+=dp[n][i];
}
rem%=MOD;
printf("%I64d\n",rem);
}
return ;
}
POJ 3254 状压DP的更多相关文章
- POJ 3254 (状压DP) Corn Fields
基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算. 我们可以先把输入中每行的01压缩成一个整数. 判断一个状态是否有相邻1: 如果 x & (x << ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- Corn Fields(POJ 3254状压dp)
题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案. 分析: dp[i][j]第i行可行状态j的的最大方案数,枚举当前行和前一行的所有状态转移就行了(不放牛也算一种情况) #i ...
- POJ 3254 状压DP(基础题)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17749 Accepted: 9342 Desc ...
- hdu 3254 (状压DP) Corn Fields
poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...
- poj 1170状压dp
题目链接:https://vjudge.net/problem/POJ-1170 题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价.接下 ...
- POJ 2411 状压DP经典
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16771 Accepted: 968 ...
- poj 1185(状压dp)
题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...
- poj 2923 状压dp+01背包
好牛b的思路 题意:一系列物品,用二辆车运送,求运送完所需的最小次数,两辆车必须一起走 解法为状态压缩DP+背包,本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态 ...
随机推荐
- 转:Google论文之三----MapReduce
文章来自于:http://www.cnblogs.com/geekma/p/3139823.html MapReduce:大型集群上的简单数据处理 摘要 MapReduce是一个设计模型,也是一个处理 ...
- poj 2983Is the Information Reliable?
http://poj.org/problem?id=2983 #include<cstdio> #include<cstring> #include<algorithm& ...
- 统计指定时间段的访问真正WEB页面(去除静态请求)的IP的TOP100排行
最近就在磨这个脚本以达到SEO同事要求哈. awk -v b=[21/Apr/2015:15:46 -v a=[21/Apr/2015:16:46 '$4 > b && $4 & ...
- 使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)
不过必须XP SP3以上才行.所有API大全: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).a ...
- 【HDOJ】5057 Argestes and Sequence
树状数组,其实很简单.只是MLE. #include <iostream> #include <cstdio> #include <cstring> using n ...
- BZOJ 1027 [JSOI2007]合金
1027: [JSOI2007]合金 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2605 Solved: 692[Submit][Status][ ...
- Qt入门(7)——QApplication类
QApplication类管理图形用户界面应用程序的控制流和主要设置.它包含主事件循环,在其中来自窗口系统和其它资源的所有事件被处理和调度.也用于处理应用程序的初始化和结束,并且提供对话管理.它也处理 ...
- Java---练习(面试题) :字符串截取(1)
在java中,字符串"abcd"与字符串"ab你好"的长度是一样,都是四个字符. 但对应的字节数不同,一个汉字占两个字节. 定义一个方法,按照指定的字节数来取子 ...
- 怎么都没人提 google 加密搜索呢? google如何稳定打开
1. 使用smarthosts提供的hosts文件 https://smarthosts.googlecode.com/svn/trunk/hosts2. 修改浏览器默认搜索引擎为 https://e ...
- 【AngularJS入门】用ng-repeat指令实现循环输出
循环输出列表很多项目在web服务端做,前端做好模版后后端写jsp代码,双方需要紧密合作,分清责任.有些项目由后端提供restful方法,前端用ajax调用自己循环,这种一般是大把的jquery拼字符串 ...