題目描述
我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
解答:
愁死我了,上來就把題目看錯了,以爲是覆蓋一個面積爲2n的大矩形,後來才發現是長n寬2的矩形。
這道題應用歸納法可以得出是一個典型的斐波那契數列。
當i=1的時候,顯然只有一種擺法。
當i=2的時候,可以有 || 和 = 兩種擺法。
當i>2的時候,如果第一個矩形是豎着擺的也就是|,那麼剩下的部分顯然是一個2*(n-1)的矩形。
而第一個矩形是橫着擺的時候,顯然必須得有兩個矩形組成=才能填滿,那麼久相當於剩下了一個2*(n-2)的一個矩形。
所以可以得到F(n)=F(n-1)+F(n-2);
典型的斐波那契數列。
算法中使用遞歸趨勢線斐波那契數列顯然是不合適的,時間開銷太過龐大,所以採用動態規劃的方法,代碼如下:
public class Solution {
public int RectCover(int target) {
int[] record = new int[target+1];
if(target==0) return 0;
if(target==1) return 1;
if(target==2) return 2;
record[0]=0;record[1]=1;record[2]=2;
for(int i=3;i<target+1;i++){
record[i]=record[i-1]+record[i-2];
}
return record[target];
}
}