广场铺砖(题解)

题目描述


有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法?

输入格式


只有一行2个整数,分别为W和H,(1<=W,H<=11)

输出格式


只有1个整数,为所有的铺法数。

样例数据


input
2 4

output

5

Solution


状态压缩的入门题。
对于放的每一块地砖,都有两种情况,一种是横的,一种是竖的,对于横着的来说,上一行的放置方式是不影响下一行的放置的,但是如果是竖着放的,那么下一行放的就必须是竖着的了,也就是看做上一行放了竖着的一半,下一行将这一半补全。

那么,我们可以将“行号”作为DP的阶段,把“上半部分”不断向下扩展,直至确定整个棋盘的分割方法。为了描述上半部分最后一行的详细形态,我们可以使用一个M位二进制数,其中第k位为1表示第k列是一个竖着的1*2长方形上面的一半,第k位为0表示其他的情况。

设f[i][j]表示第i行的形态为j时,前i行分割方案的总数。j是用十进制整数记录的M位二进制数。

第i-1行的形态k能转移到第i行的形态j,当且仅当:
1.j和k执行按位与运算的结果是0.(不能同时出现两个1)
(这保证了每个数字1的下方必须是0,代表继续补全竖着的1*2长方形)
2.j和k执行按位或运算的结果的二进制表示中,每一段连续的0都必须有偶数个。
(这些0代表若干个横着的1*2长方形,奇数个0无法分割成这种形态。)

我们可以在DP前预处理出[0, 2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值