做題感悟:爬樓梯
阿新 • • 發佈:2018-11-28
可能看到標題大家會很驚訝,畢竟這道題實在是太簡單了,但是,我要講的並不是這道題。
爬樓梯
- 總時間限制: 1000ms
- 記憶體限制:
- 65536kB
- 描述
-
樹老師爬樓梯,他可以每次走1級或者2級,輸入樓梯的級數,求不同的走法數
例如:樓梯一共有3級,他可以每次都走一級,或者第一次走一級,第二次走兩級
也可以第一次走兩級,第二次走一級,一共3種方法。 - 輸入
- 輸入包含若干行,每行包含一個正整數N,代表樓梯級數,1 <= N <= 30
- 輸出
- 不同的走法數,每一行輸入對應一行輸出
- 樣例輸入
- 5
- 8
- 10
- 樣例輸出
- 8
- 34
- 89
-
好吧,我還是簡單說一下吧。這道題屬於遞迴題中最為基礎的一道關於拆分可能性的題,因此我們只要找到遞迴通式並確定出口就可以了。例如:爬到頂樓有兩種情況,即爬一層和爬兩層,因此可以得到遞迴通式f(n)=f(n-1)+f(n-2)。遞迴出口則是f(1)=1,f(2)=2 。由此,這道題就解完了。
- 那麼,終於到了要講的重點了:
- 有人可能會發現一個問題:為什麼我敢用cin,cout?
- 其實我也不想用。。。
- 但是,由於這道題沒有給出資料組數,因此只能用迴圈讀入的方法,而這裡便用到了cin的最大的好處也是最大的缺點:cin讀入時不識別空格,即剛開始遇到空格便跳過,讀入中遇到空格便中斷,由此我們就可以有效的避免scanf讀入資料爆時間的尷尬境況。
-
其實,cin和scanf各有各的優點,各有各的缺陷,例如:cin和scanf相比就無法讀入大量資料。因此,只有合理使用,揚長避短,才能最大化優化程式碼。
- 最後,附上本題程式碼
#include<iostream> using namespace std; int a[35]; int pa(int x) { if(x==1) { return 1; } else if(x==2) { return 2; } else { return pa(x-1)+pa(x-2); } } int main() { int n; while(cin >>n) { cout << pa(n) <<endl; } return 0; }