1. 程式人生 > >hdu step 3 1 1 超級樓梯 簡單遞推 從第1級到第m級有多少種走法 每次只能走一步或兩步

hdu step 3 1 1 超級樓梯 簡單遞推 從第1級到第m級有多少種走法 每次只能走一步或兩步

               

在寫題解之前給自己打一下廣告哈~委屈。。抱歉了,希望大家多多支援我在CSDN的視訊課程,地址如下:

http://edu.csdn.net/course/detail/209

題目:

超級樓梯

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 652 Accepted Submission(s): 483
Problem Description有一樓梯共M級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第M級,共有多少種走法?
Input輸入資料首先包含一個整數N,表示測試例項的個數,然後是N行資料,每行包含一個整數M(1<=M<=40),表示樓梯的級數。
Output對於每個測試例項,請輸出不同走法的數量
Sample Input
223
Sample Output
12
Authorlcy
Source2005實驗班短學期考試
Recommendlcy

題目分析:

              簡單遞推。

程式碼如下:

/* * a.cpp * *  Created on: 2015年2月5日 *      Author: Administrator */#include <iostream>#include <cstdio>using namespace std;const int maxn = 41;int dp[maxn];void prepare
()
/**  * 關於dp[1]、dp[2]的理解  * 題目中說的是你現在已經是站在第一級上了.我們在寫程式的時候  * 後退一步,假設人在第0級。那麼這時候我們就很容理解  * 為什麼dp[1]==1  * dp[2] == 2了  *單數這時候需要注意的是題目中說的上到底3級,其實也就是上到我們程式中所說的第2級。這是需要注意的.  *這也是為什麼輸出最後的結果是dp[n-1]了  */ dp[1] = 1; dp[2] = 2int i; for(i = 3 ; i < maxn ; ++i){  /**   * 逆向思考。要想走到M級,可以分為2種情況。   * 1)從m-2級邁兩步   * 2)從m-1級邁一步   */
  dp[i] = dp[i-1] + dp[i-2]; }}int main(){ prepare(); int t; scanf("%d",&t); while(t--){  int n;  scanf("%d",&n);  printf("%d\n",dp[n-1]); } return 0;}