上樓梯

CCF NOI100003 上樓梯

上樓梯

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

題目描述

樓梯有N級臺階,上樓可以一步上一級臺階,也可以一步上兩級臺階。編一程序,計算共有多少種不同的走法。

輸入

一行,一個整數n(1 <= n <= 30),表示臺階的級數。

輸出

一個整數,走法的種數

樣例輸入


樣例輸出 
3

方案1:走三次,每次一步 
方案2:先走一級,再走兩級 
方案3:先走兩級,再走一次

問題分析:

  1. 這道題用到了遞推的思想,我們假設你現在在第n階臺階,那麼你是怎麼上來的呢,你肯定是從第n-1階或者第n-2階臺階上上來的,因爲你每次只能走一步或者兩步,所以你上到第n階臺階上所使用的方法數,就是你上到n-1階臺階上使用的方法數加上你上到n-2階臺階上使用的方法數,所以我如果用數組str[n]保存在上到第n階所用的方法數,那麼str[n] = str[n-1] + str[n-2],這個就是這道題的核心公式了,是不是想到了斐波那契數列? 
  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; 
    } 
    但是有一點值得注意的是,如果我每次賦值一個n,都要調用一次函數,但這樣會使代碼的運行效率不高,甚至在ACM中超時,不如在程序運行的開始進行一次打表,把數據都存起來,這樣在每次輸入n時,把數組中對應下標的值輸出即可。(掌握上面函數的思想,然後用打表的方法來實現)

以下是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; }

 

 


 

 

 

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