4.矩阵覆盖
问题描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解决思路:
因为可以横着覆盖也可以竖着覆盖,看起来问题复杂了很多,别担心,有了变态青蛙跳提供的解题思路,矩阵覆盖问题迎刃而解。
- 染色2*1的矩形
显然,只能将小矩形横着放。
- 染色2*2的矩形
若一开始将小矩形横着放,则剩下的也要横着放。
若一开始将小矩形竖着放,则剩下的也要竖着放。
- 染色2*3的矩形
若一开始将小矩形横着放,则剩下1*2的解决方案有F(1)。
若一开始将小矩形竖着放,则剩下2*2的解决方案有F(2)。
- 染色2*4的矩形
若一开始将小矩形横着放,则剩下2*2的解决方案有F(2)。
若一开始将小矩形竖着放,则剩下2*3的解决方案有F(3)。
显然,这个问题的规矩就是
这也就变成了一个Fibonacci 数列,递归就是解决方案
def rectCover(n):
if n < 3:
return n
else:
return rectCover(n-1) + rectCover(n-2)