一个入门标签的题,困了我好一会啊。
看完题目,第一感觉简单,这不就是铺砖问题(2*1的砖铺 2*N的 地面)的一个进阶版吗,最后2块作为一个整体铺,最后4块作为一个整体铺,递推关系式:f(n)=3*f(n-2)+2*f(n-4)。
已知条件:
骨牌是2*1的,铺不出3*N(N为奇数)的情况,所以N为奇数,铺法为0
N为0时,1 种铺法:什么都不铺
N为2时,3 种铺法,可以枚举出来,也可以参考输入输出样例
写代码,运行测试,测试样例没过。推倒重来!!!
铺砖问题的递推关系式:f(n)=f(n-1)+f(n-2),是因为要不最后两块砖竖着放,要不最后两块砖横着放,从 倒数第2块砖之前位置 一定可以垂直切开。 但本题,经过观察我们发现,其实是无法构造出一种“跨越 3 列或更多列”且“中间无法垂直切开”的形状。即它的“不可分割”模块有无数种。
为了填满 3*n,我们可以把它看作是:
一个 3*(n-2)的矩形加上一个3*2的块;
一个 3*(n-4)的矩形加上一个3*4的块;
一个 3*(n-6)的矩形加上一个3*6的块;
一个 3*(n-8)的矩形加上一个3*8的块;
......
递推公式:f(n)=3*f(n-2)+2*f(n-4)+2*f(n-6)+2*f(n-8)...+2*f(0)
直接使用这个递推公式,意味着要写双层循环,当数据量比较大时,效率堪忧,我们来看看能不能简化一下它:
f(n)=3*f(n-2)+2*f(n-4)+2*f(n-6)+2*f(n-8)...+2*f(0)
f(n-2)=3*f(n-4)+2*f(n-6)+2*f(n-8)+...+2*f(0)
f(n)-f(n-2)=3*f(n-2)-f(n-4)
f(n)=4*f(n-2)-f(n-4)
只和之前两项有关,单层循环即可,到此为止,找到了合适的递推公式