POJ 2411 Mondriaan's Dream

题意:求  I  形骨牌完全覆盖棋盘的方案总数。

做法:0表示竖直放,1表示横放,状态转移时,s1=~s2&(all-1).

#include<stdio.h>
#include<string.h>
int n,m;
long long dp[15][5000],add;
int all;
void f(int hang, int lie,int s1)
{
    if(lie==m)
    {
        dp[hang][s1]+=add;
        return;
    }
    f(hang,lie+1,s1);
    if(lie<m-1&&!(s1&1<<lie)&&!(s1&1<<(lie+1)))
    f(hang,lie+2,s1+(3<<lie));
}
int main()
{
    int t,i,p;
    long long ans;
    while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
    {
        if(m>n)
        {
            t=m;
            m=n;
            n=t;
        }
        memset(dp,0,sizeof(dp));
           all=1<<m;
           add=1;
            f(0,0,0);
            for(i=1;i<n;i++)
             for(p=0;p<all;p++)
               if(dp[i-1][p])
               {
                   add=dp[i-1][p];
                 f(i,0,~p&(all-1));
               }
               ans=dp[n-1][all-1];
        printf("%I64d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(POJ 2411 Mondriaan's Dream)