玉米田(状压DP)

题目:P1879 [USACO06NOV]玉米田Corn Fields

参考:状态压缩动态规划 状压DP

农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地。John打算在牧场上的某几格里种上美味的草,供他的奶牛们享用。

遗憾的是,有些土地相当贫瘠,不能用来种草。并且,奶牛们喜欢独占一块草地的感觉,于是John不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。

John想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案)

输入输出格式

输入格式:

第一行:两个整数M和N,用空格隔开。

第2到第M+1行:每行包含N个用空格隔开的整数,描述了每块土地的状态。第i+1行描述了第i行的土地,所有整数均为0或1,是1的话,表示这块土地足够肥沃,0则表示这块土地不适合种草。

输出格式:

一个整数,即牧场分配总方案数除以100,000,000的余数。

代码解释:

/***********************************************/
const int maxn= 4096;
bool ju[maxn+6];//判断此方案是否符合草地不连续
int dp[20][maxn+6];//对第i行状态j时,前i行的方案数
int maps[20];//二进制地图
int main()
{
	int m,n;
	cin>>m>>n;
	int a;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++) {
			cin>>a;
			maps[i]=(maps[i]<<1)+a;
		}
	}
	int maxnn=(1<<n)-1;
	for(int i=0;i<=maxnn;i++)
		if(((i&(i<<1))==0) && ((i&(i>>1))==0)) ju[i]=true;//可行
	//说明i方案二进制没有相邻的两个1 

	//预处理dp第一行
	for(int j=0;j<=maxnn;j++)
		if( (ju[j]) && ( (j & maps[1]) ==j) ) dp[1][j]=1;
	/*
	(j & maps[1]) ==j //必须打括号,&优先级低于==(这是个WA点...)
	它用来判断maps[1]二进制的1是否包含了j中的1
	如:maps[1] :1001101
		   j    :1000100
	所以:&		:1000100
	如果 & 操作后值为j,则表示j方案在地图map上可行
	*/
	for(int i=2;i<=m;i++)
	{
		for(int j=0;j<=maxnn;j++)//枚举i行的每个状态
		{
			if( (ju[j])  && ( j & maps[i]) ==j)
			{//再判断和前面的行会不会冲突
			//不冲突就都加上
				for(int k=0;k<=maxn;k++)
					if((j&k)==0)//不冲突
						dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
			}
		}
	}
	ll ans=0;
	for(int j=0;j<=maxnn;j++) ans=(ans+dp[m][j])%mod;
	cout<<ans<<endl;
    return 0;
}

  

原文地址:https://www.cnblogs.com/liuyongliu/p/10327921.html

时间: 2024-07-30 22:15:42

玉米田(状压DP)的相关文章

题解——[USACO06NOV]玉米田Corn Fields 状压DP

题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的奶牛们享用. 遗憾的是,有些土地相当贫瘠,不能用来种草.并且,奶牛们喜欢独占一块草地的感觉,于是John不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边. John想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案) 输出一个整数,即牧

P1879 [USACO06NOV]玉米田Corn Fields 状压dp

链接在此! 正解:状压dp(emm……据说插头dp也可以趴但我不管!!!不会!!! 解题报告: ……我真的太菜了……我以为一个小时前要搞完的题目调错误调了一个小时……90分到100我差不多搞了一个小时…… 然后这题还是做过的……就很气,觉得确实是要搞下博客没事儿复习下不然做过的题目还花俩小时我真的哭死…… 先放上错误的90分代码讲一下错哪儿了(因为……其实100并不难是可以想到的……没有太大讲的意义,主要我太菜了所以才会搞这么久TT 点我♂看♂沙雕灵巧在线WA题 然后错误的点是最后一个点RE,开

[USACO06NOV]玉米田Corn Fields (状压$dp$)

题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 块草皮,且最后一位状态为 \(k\) . 同时多记录一个每一列中的不能放的位置 \(w[i]\). 然后就可以很轻松的转移了... 转移方程看代码. Code #include<bits/stdc++.h> #define ll long long using namespace std; ll f[13][145][10000],n,K; ll js[1000

算法复习——状压dp

状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达到目的····此时熟悉相关的位运算就很重要了····以下是常见的一些需要位运算方法 然后说实话状压dp其它方面就和普通dp差不多了···它不像数位区间树形那样或多或少好歹有自己一定套路或规律····如何想到转移方程和状态也就成了其最难的地方··· 例题: 1.Corn Fields(poj3254)

第一次接触状压DP

状压DP入门及理解 *(另类的暴力)*      一般状态数不多的时候就会开数组,但是有的状态并不好表示,于是,状压DP就产生了.     状压DP应该是分两类的,一类是压缩状态,另一类是舍弃状态.    我感觉初学状压DP难就难在二进制运算的应用,了解二进制运算符就显得十分重要.     所以我们先看下表,如果有不会二进制简单应用的请点击https://blog.csdn.net/sinat_35121480/article/details/53510793(神犇请忽略...) 下面就可以看题

状压DP总结

状态压缩就是将一行的状态压成一个二进制数,这个数的二进制形式反映了这一行的情况 比如0100111的意义为:这一排的第一个数没被使用,第二个被占用了,第三四个没被占用,第五六七个被占用 我们知道位运算和状压DP一样,也是在二进制下进行的,所以位运算往往可以解决很多问题 我们来看看状压DP(位运算)的常用操作: 有了这些位运算的帮助,我们便可以更加容易的对每一排的状态进行处理 我们来看到状态压缩DP的经典问题(博主正在缓慢更新ing) 一.P1879 [USACO06NOV]玉米田Corn Fie

poj3254 Corn Fields (状压DP)

http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7588   Accepted: 4050 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parc

poj3254(Corn Fields)状压dp

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

POJ 1684 Corn Fields(状压dp)

描述 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 can't be