zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    在排序数组中查找元素
    搜索旋转排序数组
    下一个排列
    括号生成(回溯法)
    PHP之表单
    PHP之超级全局变量
    PHP之数组
    PHP之字符串
    PHP之常量
    PHP之echo/print
  • 原文地址:https://www.cnblogs.com/lokiii/p/8982616.html
Copyright © 2011-2022 走看看