矩形覆蓋

題目描述: 我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
分析:

如圖,設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];
}
搞定收工。

發佈了109 篇原創文章 · 獲贊 49 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章