Corn Fields POJ
来源:互联网 发布:cad软件下载 编辑:程序博客网 时间:2024/06/10 18:25
#include <cstdio>
#include <cstring>
const int mod = 100000000;
int st[1<<13]; // 存没有相邻1的每一行的状态
int map[1<<13]; //给出地的状态 (贫瘠土地标记为1)
int dp[13][1<<13]; //表示第i行状态为j时可以放牛的种数
bool judge1(int x) //判断x对应二进制有没有相邻的1
{
return (x&(x<<1)); //判断一个数相邻两位是不是同时为1,假如同时为 1 则返回一个值,否则返回 0 ,这样
}
bool judge2(int i,int x)
{
return (map[i]&st[x]); // 两个数的二进制对应位都是1时这位才得1否则是0。
}
int main()
{
int n,m,x;
while(~scanf("%d%d",&n,&m))
{
memset(st,0,sizeof(st));
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++){
scanf("%d",&x);
if(x==0)
map[i]+=(1<<(j-1)); //给出地的状态 (贫瘠土地标记为1)
}
}
int k=0;
for(int i=0;i<(1<<m);i++)//枚举每一种状态
{
if(!judge1(i)) // 存没有相邻1的每一行的可能状态
st[k++]=i;
}
for(int i=0;i<k;i++)
{
if(!judge2(1,i)) //如果给出地的贫瘠状态与该情况下列举状态的每个1对应,那无法放置
dp[1][i]=1;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<k;j++)
{
if(judge2(i,j)) //判断第i行 假如按状态j放牛的话行不行。
continue; //不能放,所以继续
for(int f=0;f<k;f++)
{
if(judge2(i-1,f)) //剪枝 判断上一行与其状态是否满足
continue;
if(!(st[j]&st[f]))
dp[i][j]+=dp[i-1][f];
}
}
}
int ans=0;
for(int i=0;i<k;i++)
{
ans+=dp[n][i];
ans%=mod;
}
printf("%d\n",ans);
}
return 0;
}
#include <cstring>
const int mod = 100000000;
int st[1<<13]; // 存没有相邻1的每一行的状态
int map[1<<13]; //给出地的状态 (贫瘠土地标记为1)
int dp[13][1<<13]; //表示第i行状态为j时可以放牛的种数
bool judge1(int x) //判断x对应二进制有没有相邻的1
{
return (x&(x<<1)); //判断一个数相邻两位是不是同时为1,假如同时为 1 则返回一个值,否则返回 0 ,这样
}
bool judge2(int i,int x)
{
return (map[i]&st[x]); // 两个数的二进制对应位都是1时这位才得1否则是0。
}
int main()
{
int n,m,x;
while(~scanf("%d%d",&n,&m))
{
memset(st,0,sizeof(st));
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++){
scanf("%d",&x);
if(x==0)
map[i]+=(1<<(j-1)); //给出地的状态 (贫瘠土地标记为1)
}
}
int k=0;
for(int i=0;i<(1<<m);i++)//枚举每一种状态
{
if(!judge1(i)) // 存没有相邻1的每一行的可能状态
st[k++]=i;
}
for(int i=0;i<k;i++)
{
if(!judge2(1,i)) //如果给出地的贫瘠状态与该情况下列举状态的每个1对应,那无法放置
dp[1][i]=1;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<k;j++)
{
if(judge2(i,j)) //判断第i行 假如按状态j放牛的话行不行。
continue; //不能放,所以继续
for(int f=0;f<k;f++)
{
if(judge2(i-1,f)) //剪枝 判断上一行与其状态是否满足
continue;
if(!(st[j]&st[f]))
dp[i][j]+=dp[i-1][f];
}
}
}
int ans=0;
for(int i=0;i<k;i++)
{
ans+=dp[n][i];
ans%=mod;
}
printf("%d\n",ans);
}
return 0;
}
阅读全文
0 0
- poj 3254Corn Fields
- POJ 3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- poj 3254---Corn Fields
- poj 3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- (poj)3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- poj 3254 Corn Fields
- POJ 3254 Corn Fields
- POJ 3254 Corn Fields
- poj-3254-Corn Fields
- poj 3254 Corn Fields
- LeetCode题-coins in a line
- redis 事务 理解和使用
- android开发键盘状态监听
- shell之sed
- XYNUOJ 确定比赛名次(拓补)
- Corn Fields POJ
- Libevent-2.1.8源码分析——日志消息
- Java设计模式之观察者模式
- HDOJ2117 简单模拟题
- 通过Nhibernate连接Mysql数据库
- linux中的http服务浅谈(2)
- Java 8学习之Stream API
- xpath语言使用
- 2017百度之星初赛(B) 1006 小小粉丝度度熊(尺取法)