在一个3 * N(长度为3,宽度为N)的长方形方格中,铺满1X2的骨牌(骨牌个数不限制),给定N,求方案数。
● 举例:(图一 -1-1为N=2的所有方案),所以N=2时方案数为3。
宽度为3的话,分为三种情况,3*i的方格,分别多出来0块、1块、2块,计作f[i][0], f[i][1], f[i][2]。
根据上图可以看出:
f[i][0] = f[i-2][0] + f[i-1][1] + f[i-2][2]
f[i][1] = f[i-1][2]
f[i][2] = f[i-1][1] + f[i][0]
边界条件f[0][0] = f[1][1] = f[0][2] = 1
那么 3*i 的方格平铺 1*2 的骨牌的方案数为:
f[i] = f[i][0] = f[i-2][0] + f[i-2][1] + f[i-2][2]
= (f[i-4][0] + f[i-4][1] + f[i-4][2]) + f[i-3][2] + (f[i-3][1] + f[i-2][0])
题解
def f(n):
if n % 2 == 1:
return 0
d = {i:{} for i in range(n+1)}
d[0][0] = 1
d[0][2] = 1
for i in range(1, len(d)):
if i % 2 == 0:
d[i][0] = d[i-2][0] + d[i-1][1] + d[i-2][2]
d[i][2] = d[i - 1][1] + d[i][0]
else:
d[i][1] = d[i-1][2]
return d[n][0]