CCF NOI100003 上樓梯
上樓梯
時間限制: 1000 ms 空間限制: 262144 KB
題目描述
樓梯有N級臺階,上樓可以一步上一級臺階,也可以一步上兩級臺階。編一程序,計算共有多少種不同的走法。
輸入
一行,一個整數n(1 <= n <= 30),表示臺階的級數。
輸出
一個整數,走法的種數
樣例輸入
3
樣例輸出
3
方案1:走三次,每次一步
方案2:先走一級,再走兩級
方案3:先走兩級,再走一次
問題分析:
- 這道題用到了遞推的思想,我們假設你現在在第n階臺階,那麼你是怎麼上來的呢,你肯定是從第n-1階或者第n-2階臺階上上來的,因爲你每次只能走一步或者兩步,所以你上到第n階臺階上所使用的方法數,就是你上到n-1階臺階上使用的方法數加上你上到n-2階臺階上使用的方法數,所以我如果用數組str[n]保存在上到第n階所用的方法數,那麼str[n] = str[n-1] + str[n-2],這個就是這道題的核心公式了,是不是想到了斐波那契數列?
- 定義一個函數來實現這一思路:
long long floorNum(long long n) { long long a = 1; long long b = 2; long long sum = 0; if(n==1) return 1; if(n==2) return 2; for(int i=3;i<=n;i++) { sum = a + b; a = b; b = sum; } return sum; }
以下是AC代碼:
#include<iostream> using namespace std; long long str[100]; void floorNum() //此函數用來main函數開始的打表,用數組str[]保存 { str[1] = 1; str[2] = 2; for(int i=3;i<=50;i++) { str[i] = str[i-1] + str[i-2]; } } int main() { floorNum(); //調用打表的函數 int n; while(cin>>n) { cout<<str[n]<<endl; } return 0; }