HDU1290 重建希望小學【遞推+打表】

悼念512汶川大地震遇難同胞——重建希望小學

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10010 Accepted Submission(s): 6636

Problem Description
下面是512汶川大地震部分受災學校傷亡情況(慘痛!!)

1、 四川省都江堰市 聚源中學
傷亡情況:遇難學生人數(含失蹤)320
詳細說明: 一棟教學樓被震垮,該樓18個班420多名學生被埋,截至目前僅有不到100名獲救。
2、 四川省綿陽市 北川縣北川中學
傷亡情況:遇難學生人數(含失蹤)1200多人
詳細說明:學校教室損毀情況嚴重,六至七層高的主教學樓已經垮塌得只有一人多高,其他兩個教學樓和宿舍也有不同程度垮塌
3、四川省綿陽市 北川縣曲山小學(綿陽市示範小學)
傷亡情況:遇難學生人數(含失蹤)698人
詳細說明:學校位於北川縣郊一公里處的任家坪鎮,在校師生人數 1003人,地震使學校一座五層教學樓的整體倒塌,只剩下了一層
4、四川省綿陽市 北川縣曲山幼兒園
傷亡情況:在校師生人數500多,僅生還20餘人
詳細說明:學校位於綿陽市北川縣曲山鎮危家巷,曲山幼兒園及學前班500多名學生被滑坡氣浪推移20多米,教學大樓像竹編一樣倒下,整體向外挪出五十公分僅憑肉眼根本無法作出判斷這是四層樓……
5、四川省綿陽市 北川縣茅壩初中
傷亡情況:在校師生人數240多,僅生還20餘人
詳細說明:教室被泥石流掩埋,學校只剩一根歪歪斜斜的旗杆和一面鮮豔的五星紅旗……
……
在這裏插入圖片描述

爲什麼會有這麼多的學校傷亡慘重?也許有很多值得我們調查的東西。但對於我們來說,當前最緊迫的任務是重建學校,以便讓倖存的學生早日走進課堂。
這不,一所由社會各界捐款修建的希望小學馬上就要竣工了!學校教室的長度爲n米,寬度爲3米,現在我們有2種地磚,規格分別是1米×1米,2米×2米,如果要爲該教室鋪設地磚,請問有幾種鋪設方式呢?

Input
輸入數據首先包含一個正整數C,表示包含C組測試用例,然後是C行數據,每行包含一個正整數n(1<=n<=30),表示教室的長度。

Output
對於每組測試數據,請輸出鋪設地磚的方案數目,每個輸出佔一行。

Sample Input
2
2
3

Sample Output
3
5

Author
lcy

Source
2008-06-18《 ACM程序設計》期末考試——四川加油!中國加油!

問題鏈接HDU1290 悼念512汶川大地震遇難同胞——重建希望小學
問題簡述:(略)
問題分析
    組合數學的鋪磚問題,關鍵是找出數學遞推式。教室長度爲n,寬度爲3,考慮以下情形:
n=1,只能用1×1的3塊磚來鋪,鋪磚方式是1種,f(1)=1;
n=2,全用1×1的磚來鋪,或使用1塊2×2的磚加2塊(有2種擺放方式),f(2)=3;
n=3,在n=1的基礎上,有2種擺放方式(不能全用全用1×1的磚來鋪,考慮重複計算),在n=2的基礎上只有1種擺放方式(全用1×1的磚來鋪),f(3)=f(1)*2+f(2);
得f(n)=f(n-1)*2+f(n-1),這也是一般式。
在這裏插入圖片描述

    打表是必要的,可以加快程序計算速度。
程序說明:(略)
參考鏈接:(略)
題記:(略)

AC的C++語言程序如下:

/* HDU1290 悼念512汶川大地震遇難同胞——重建希望小學 */

#include <bits/stdc++.h>

using namespace std;

const int N = 30;
int f[N + 1];

int main()
{
    f[0] = 0;
    f[1] = 1;
    f[2] = 3;
    for(int i = 3; i <= N; i++)
        f[i] = f[i - 2] * 2 + f[i - 1];

    int c, n;
    scanf("%d", &c);
    while(c--) {
        scanf("%d", &n);
        printf("%d\n", f[n]);
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章