POJ 2411 Mondriaan's Dream 状态压缩

来源:互联网 发布:c语言的编程环境 编辑:程序博客网 时间:2024/06/10 03:20

题意:

用1*2的矩形铺满n*m的大矩形有几种方式

分析:

n,m很小可以状态压缩我们发现第i行的情况只和i-1行和i行有关判断一下爆搜一下

ACcode:

#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <vector>#define maxn 205#define inf 0x3f3f3f3f#define ll long longusing namespace std;int n,m;ll dp[20][1<<11],tmp;void dfs(int state,int x,int pos){    if(pos==m){        dp[x][state]+=tmp;        return ;    }    dfs(state,x,pos+1);///竖着    if(pos<=m-2&&!(state&1<<pos)&&!(state&1<<pos+1))dfs(state|1<<pos|1<<pos+1,x,pos+2);///横着}int main(){    while(scanf("%d%d",&n,&m)&&n+m){        if(n*m&1){cout<<"0\n";continue;}        memset(dp,0,sizeof(dp));        tmp=1;        dfs(0,1,0);        for(int i=2;i<=n;++i)            for(int j=0;j<1<<m;++j)                if(dp[i-1][j])tmp=dp[i-1][j],dfs(~j&((1<<m)-1),i,0);        cout<<dp[n][(1<<m)-1]<<'\12';    }    return 0;}


0 0
原创粉丝点击