poj 2411

题意:1*2的砖块填满n*m的地板

思路:i行j列由i-1行j列推得,i-1行j列处竖放得到或i行横放得到;枚举i行横放的方法数和i-1行的状态数;

#include<cstdio>
#include<cstring>
long long f[30][1<<12],i,j,height,width,saya=1;
void sayatime(int i,int s1,int pos)//行数,第i行已填格数,状态
{
    if(pos==width) {f[i][s1]+=saya;return;}
    sayatime(i,s1,pos+1);
    if(pos<=width-2&&!(s1&1<<pos)&&!(s1&1<<pos+1))//pos未越界且后面有两个空格
        sayatime(i,s1|1<<pos|1<<pos+1,pos+2);//行数,第i行已填格子数,状态
}
int main()
{
    while(scanf("%d%d",&height,&width))
    {
        if(height==0&&width==0) break;
        memset(f,0,sizeof(f));
        saya=1;
        sayatime(1,0,0);
        for(i=2;i<=height;i++)
        {
            for(j=0;j<1<<width;j++)
            {
                if(f[i-1][j]) saya=f[i-1][j];
                else continue;
                sayatime(i,~j&((1<<width)-1),0);
            }
        }
        printf("%lld\n",f[height][(1<<width)-1]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值