1. 程式人生 > >CCF NOI1072.爬樓梯【遞推】【打表】

CCF NOI1072.爬樓梯【遞推】【打表】

時間限制: 1000 ms  空間限制: 262144 KB  具體限制  

題目描述

樹老師爬樓梯,他可以每次走1級或者2級,輸入樓梯的級數,求不同的走法數。例如: 樓梯一共有3級,他可以每次都走一級,或者第一次走一級,第二次走兩級,也可以第一次走兩級,第二次走一級,一共3種方法。

輸入

輸入包含若干行,每行包含一個正整數N(1<=N<=30),代表樓梯級數。

輸出

不同的走法數,每一行輸入對應一行輸出。

樣例輸入

5
8
10

樣例輸出

8
34
89

資料範圍限制

1<=N<=30

題記:

這道題可以這樣想:n個臺階,可以在n-2個臺階的時候走一次兩級到達,也可以在n-1個臺階的時候走一級到達。遞推關係明顯,所以得到走法的關係式:f(n)=f(n-2)+f(n-1),n>3。

提前打個表免得每次都要從頭開始推,節省時間。

C++程式如下:

#include <iostream>

using namespace std;
#define N 30
typedef unsigned long long ULL;
ULL stairs[N+1];
 
void setstairs(int n)
{
    ULL s1=1, s2=2, temp;
 
    stairs[0] = 0;
    stairs[1] = 1;
    stairs[2] = 2;
 
    for(int i=3; i<=n; i++) {
        temp = s1 + s2;
        s1 = s2;
        s2 = temp;
        stairs[i] = s2;
    }
}
 
int main(void)
{
    int n;
    setstairs(N);
 
    while(cin >> n)
        cout << stairs[n] << endl;
 
    return 0;
}