【poj3254】 Corn Fields

http://poj.org/problem?id=3254 (题目链接)

题意

  给出一块n*m的田地,有些能够耕种,有些不能。要求将牛两两不相邻的放在田中,牛的个数至少为1个。问有多少种放法。

Solution

  状压dp水题。

  f[i][j]表示第i行状态为j时,前i行的总方案数。

代码

// poj3254
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define MOD 100000000
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

int a[1000010],f[20][100010],n,m;

bool check(int x,int flag) {
	if ((a[x]&flag)!=flag) return 0;   //是否符合地图
	if ((flag&(flag<<1))!=0 || (flag&(flag>>1))!=0) return 0;   //是否有相邻
	return 1;
}
int main() {
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) {
		int x;a[i]=0;
		for (int j=1;j<=m;j++) {
			scanf("%d",&x);
			a[i]=(a[i]<<1)+x;
		}
	}
	f[0][0]=1;
	int maxl=1<<m;
	for (int i=1;i<=n;i++)
		for (int j=0;j<maxl;j++) {   //枚举当前行状态
			if (check(i,j)==0) continue;
			for (int k=0;k<maxl;k++) {   //枚举上一行状态
				if ((j&k)!=0) continue;
				f[i][j]=f[i][j]+f[i-1][k];
				f[i][j]%=MOD;
			}
		}
	int ans=0;
	for (int i=0;i<maxl;i++) ans=(ans+f[n][i])%MOD;
	printf("%d\n",ans);
	return 0;
}

  

时间: 2024-10-08 09:58:13

【poj3254】 Corn Fields的相关文章

【POJ3254】Corn Fields

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

【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

poj3254(Corn Fields)状压dp

题意:在n*m(1<=n,m<=12)的矩阵上种植玉米,任意共边的方格不能同时种,并且有些特定方格也不能种.问能有多少种种植的方案: 解法:很经典的状压模型.先将每一行的合法状态求出来,12的时候最多377个合法状态.然后进行与行之间的状态转移.最坏复杂度12*(377^2) 代码: /**************************************************** * author:xiefubao **********************************

POJ3254:Corn Fields(状态压缩)

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

【bzoj1725/Usaco2006 Nov】Corn Fields牧场的安排——状压dp

Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ还没有决定在哪些土地上种草. 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少

【POJ3254】coinfield

状压dp初步. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 600 #define yql 1000000000 int n,m,top,a[N],v[N],dp[20][N],now[N]; inline bool lineck(int x){return (x&(x<<1))?0:1;} inline void

【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ还没有决定在哪些土地

POJ 3254 Corn Fields 【状压DP】

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

【BZOJ】1725: [Usaco2006 Nov]Corn Fields牧场的安排

[算法]状压DP [题解]对于上一行的每个状态,每行进行DFS. #include<cstdio> #include<algorithm> #include<cstring> #define ll long long using namespace std; const int maxn=20,maxN=10000,MOD=100000000; ll f[2][maxN]; int n,m,x,h; bool map[maxn][maxn]; void dfs(int