poj 3254

状压DP。位运算真是弱项

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<queue>
 6 #define inc(i,l,r) for(int i=l;i<=r;i++)
 7 #define dec(i,l,r) for(int i=l;i>=r;i--)
 8 #define link(x) for(edge *j=h[x];j;j=j->next)
 9 #define mem(a) memset(a,0,sizeof(a))
10 #define inf 1e9
11 #define ll long long
12 #define succ(x) (1<<x)
13 #define NM 13
14 using namespace std;
15 int read(){
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
18     while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
19     return x*f;
20 }
21 int a[NM],b[succ(NM)],d[NM][succ(NM)],n,m,ans,s;
22 int main(){
23     n=read();m=read();
24     inc(i,1,n)
25     inc(j,1,m)
26     if(!read())a[i]+=succ(j-1);
27     inc(t,0,succ(m)-1)
28     if((t&(t<<1))==0){
29     b[++s]=t;
30     if(!(t&a[1]))
31     d[1][t]=1;
32     }
33     inc(i,2,n){
34     inc(t,1,s){
35         if(b[t]&a[i])continue;
36         inc(v,1,s)
37         if(!(b[v]&b[t]))
38         d[i][b[t]]+=d[i-1][b[v]];
39 //        printf("%d %d\n",b[t],d[i][b[t]]);
40     }
41     }
42     inc(t,0,succ(m)-1)(ans+=d[n][t])%=100000000;
43     printf("%d\n",ans);
44     return 0;
45 }

时间: 2024-08-24 09:42:28

poj 3254的相关文章

POJ 3254 Corn Fields 状态压缩DP (C++/Java)

http://poj.org/problem?id=3254 题目大意: 一个农民有n行m列的地方,每个格子用1代表可以种草地,而0不可以.放牛只能在有草地的,但是相邻的草地不能同时放牛, 问总共有多少种方法. 思路: 状态压缩的DP. 可以用二进制数字来表示放牧情况并判断该状态是否满足条件. 这题的限制条件有两个: 1.草地限制. 2.相邻限制. 对于草地限制,因为输入的时候1是可以种草地的. 以"11110"草地分析,就只有最后一个是不可以种草的.取反后得00001  .(为啥取反

POJ 3254 Corn Fields (状压DP+滚动数组)

题目地址:POJ 3254 状压水题. 先预处理出每行所有可能出现的情况.然后可以用vector存起来. 然后先处理出第一行所有的情况.然后再从第二行开始不断与上一行进行状态转移,状态转移很简单就不说了. 最后统计出最后一行的个数和就可以了. 代码如下; #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #

poj 3254 Corn Fields ,状态压缩DP

题目链接 题意: 一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案(一头牛都不放也是一种方案) state[i] 表示对于一行,保证不相邻的方案 状态:dp[i][ state[j] ]  在状态为state[j]时,到第i行符合条件的可以放牛的方案数 状态转移:dp[i][ state[j] ] =Sigma dp[i-1][state'] (state'为符合条

poj 3254 Corn Fields 国家压缩dp

意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对它有影响.故对这n个格子进行编码为状态S,表示种完(多米诺骨牌那题是放置前.注意差别,都可行)这n个格子的状态.父问题由稍小子问题逐步解决,正是动态规划的思想. 代码: //poj 3254 //sep9 #include <iostream> using namespace std; const

【POJ 3254】 Corn Fields(状压DP)

[POJ 3254] Corn Fields(状压DP) Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10891   Accepted: 5705 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parce

poj 3254 状压dp入门题

1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相邻,求有多少种放法. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #d

POJ 3254 Corn Fields 【状压DP】

[题目大意]一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案(一头牛都不放也是一种方案) [解析]根据题意,把每一行的状态用二进制的数表示,0代表不在这块放牛,1表示在这一块放牛.首先很容易看到,每一行的状态要符合牧场的硬件条件,即牛必须放在能放牧的方格上.这样就能排除一些状态.另外,牛与牛之间不能相邻,这样就要求每一行中不能存在两个相邻的1,这样也能排除很多状态.

POJ 3254 Corn Fields //入门状压dp

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7578   Accepted: 4045 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 yumm

Corn Fields POJ - 3254 &amp;&amp; 炮兵阵地 POJ - 1185

第一个题题目链接: POJ - 3254 第二个题题目链接:POJ - 1185 第一个题的题目大意:给你一个n*m的01矩阵,然后让你安排奶牛,只有为1的地方能安置奶牛,0的地方不能安置奶牛.当在一个为1的地方安置奶牛的时候,这个奶牛的四周都不能防止奶牛,会起冲突.然后问你一共有多少种安置方案. 具体思路:我们把每一行按照二进制压缩,然后每一次枚举合法的状态,看是否能安置上奶牛,然后枚举当前一行的时候,判断是否冲突就好了.然后最终计算答案的时候累加最后一行为某一个合法状态时的方案数. AC代码

POJ 3254 Corn Fields 状态压缩DP

题目链接:http://poj.org/problem?id=3254 思路:状态压缩DP,状态方程为dp[i][j] += (dp[i-1][k]) code: #include <stdio.h> #include <string.h> #define N 500 const int MOD = 100000000; int dp[15][N],ant[N],n,m,k,map[15]; bool ok(int x) { if(x&(x<<1))return