bzoj 1725: [Usaco2006 Nov]Corn Fields牧场的安排【状压dp】

压一维状态,转移时把符合条件的上一行加上

#include<iostream>
#include<cstdio>
using namespace std;
const int N=5005,mod=1e9;
int m,n,x,a[20],st[N],k,f[20][N],ans;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&x);
			if(!x)
				a[i]|=(1<<(j-1));
		}
    for(int i=0;i<(1<<m);i++)
		if(!(i&(i<<1)))
			st[++k]=i;
    for(int i=1;i<=k;i++)
		if(!(a[1]&st[i]))
			f[1][st[i]]=1;
    for(int i=2;i<=n;i++)
		for(int j=1;j<=k;j++)
			if(!(st[j]&a[i]))
			{
				for(int q=1;q<=k;q++)
					if(!(st[q]&a[i-1])&&!(st[j]&st[q]))
						f[i][st[j]]+=f[i-1][st[q]];
			}
    for(int i=1;i<=k;i++)
		ans=(ans+f[n][st[i]])%mod;
    printf("%d",ans);
    return 0;
}
posted @ 2018-05-02 21:31  lokiii  阅读(94)  评论(0编辑  收藏  举报