P1879 [USACO06NOV]玉米田Corn Fields

P1879 [USACO06NOV]玉米田Corn Fields

这道题跟互不侵犯差不多,但是数据范围更大了

对于状态压缩dp,提前枚举出转移是一种很好的优化

然后对于转移也需要仔仔细细的分析,如同期望dp

#include<cstdio>
#include<algorithm>
#include<iostream>
const int mod=1e8;
int map[20];
long long f[2][1<<12];
int b[400],tot;
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	int a;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&a);
			a^=1;
			map[i]=(map[i]<<1)+a;
		}
	for(int i=0;i<(1<<m);i++)
		if(!(i&(i<<1))&&!(i&(i>>1)))	b[++tot]=i;
	for(int i=1;i<=tot;i++)
		if(!(map[1]&b[i]))
			f[1][b[i]]=1;
	for(int i=2;i<=n;i++)
		for(int j=1;j<=tot;j++)
		{
			f[i&1][b[j]]=0;
			if(!(map[i]&b[j]))
				for(int k=1;k<=tot;k++)
					if(!(b[j]&b[k])&&!(map[i-1]&b[k]))
						f[i&1][b[j]]=(f[i&1][b[j]]+f[(i&1)^1][b[k]])%mod;
		}
	long long ans=0;
	for(int i=1;i<=tot;i++)
		ans=(ans+f[n&1][b[i]])%mod;
	printf("%lld",ans);
}
posted @ 2018-07-27 21:18  Lance1ot  阅读(218)  评论(0编辑  收藏  举报