分析:
如圖,設n=3,設我們從最左邊開始覆蓋,一開始,我們有兩種選擇,豎着放或者橫着放,若橫着放第一塊後,下一塊必然要把4個格子填滿。然後圖像就分爲已經填好的,和還沒填好的。可以看到剩下還沒填好的,其實是初始問題n的一個子問題。
於是f(n) = f(n-1) + f(n-2),於是這又是一個斐波那契數列問題。
用自底向上動態規劃來做。當n爲0時,f(0) = 1; 當n爲1時,f(1) = 1; 當n爲2時,f(2) = 2;
代碼如下:
//自底向上的動態規劃
unsigned long long rectCover(int number)
{
//題目保證 number 最大爲100
static unsigned long long Counter[101] = {0};
Counter[0] = 1;
Counter[1] = 1;
Counter[2] = 2;
static int calculatedIndex = 2;
if(number <= calculatedIndex)
return Counter[number];
//防止下標越界
if(number > 100)
number = 100;
for(int i = calculatedIndex + 1; i <= number; i++)
{
Counter[i] = Counter[i - 1] + Counter[i - 2];
}
calculatedIndex = number;
return Counter[number];
}
搞定收工。