题目描述
有一个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