YT03-遞推求解課後題目-1002 超級樓梯-(6.7日-煙臺大學ACM預備隊解題報告)

kewlgrl發表於2015-06-13

超級樓梯

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 97   Accepted Submission(s) : 38

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

有一樓梯共M級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第M級,共有多少種走法?

Input

輸入資料首先包含一個整數N,表示測試例項的個數,然後是N行資料,每行包含一個整數M(1<=M<=40),表示樓梯的級數。

Output

對於每個測試例項,請輸出不同走法的數量

Sample Input

2
2
3

Sample Output

1
2

Author

lcy

Source

2005實驗班短學期考試




144-2劉炎


解題思路:


每次有2種走法,並且要求最後還能正好到達M級。正著不行,逆向思維一下:要達到最後一級的前一級有兩種可能,M-1或者M-2;

也就是說就是到達M-1的走法加上M-2的走法相加就等於到達最後一級的走法。

所以遞推公式:

                      F(1)=1F(2)=1

                      F(n)=F(n-1)+F(n-2);


可以用遞迴或者遞推兩種方法實現

遞迴找的是遞迴函式,遞推找的是遞推公式;

遞迴函式每一次的呼叫都要保留現場,佔用空間,多組測試容易超時,遞推只需要公式打表即可;

long longjisuan(intn)

{

    if(n==1)return 1;

    if(n==2)return 2;

    else return jisuan(n-1)+jisuan(n-2);

}


#include <iostream>  
using namespace std;   
int main()  
{  
    int a[41],N,M;   
    cin>>N;    
    a[1]=1; a[2]=1;  
    for(int i=3;i<=40;i++)  
        a[i]=a[i-1]+a[i-2];  
    while(N--)
    {  
        cin>>M;  
        cout<<a[M]<<endl;  
    }  
    return 0;  
}


相關文章