問題鏈接:CCF NOI1072 爬樓梯。
時間限制: 1000 ms ?空間限制: 262144 KB
題目描述?
ccf多少分?? 樹老師爬樓梯,他可以每次走1級或者2級,輸入樓梯的級數,求不同的走法數。例如:樓梯一共有3級,他可以每次都走一級,或者第一次走一級,第二次走兩級,也可以第一次走兩級,第二次走一級,一共3種方法。
輸入
? 輸入包含若干行,每行包含一個正整數N(1<=N<=30),代表樓梯級數。
輸出
? 不同的走法數,每一行輸入對應一行輸出。
ccf2021,樣例輸入
5
8
10
樣例輸出
ccf300分什么水平。8
34
89
數據范圍限制
? 1<=N<=30
封閉式樓梯、
問題分析
? 這是一個遞推的問題。站在樓梯的第n級想一下,前一步是從哪里來的,問題就清楚了。
? 由于每次只能上一級或兩級,那么f(n)=f(n-2)+f(n-1)。這不就是一個菲波拉契數列嗎?就是一個遞推問題?
雙步梯高層建筑圖畫樓梯結構圖。? 可是,開始時候是站在第1級臺階上,所以數列的開始幾項會有所不同。
? f(1)=0,因為開始就站在第1級臺階上;
? f(2)=1,只能從第1級臺階上1級;
? f(3)=2,只能從第1級臺階上2級,或只能從第2級臺階上1級;
? f(n)=f(n-2)+f(n-1),n>3。
高層建筑消防樓梯的設計要求,? 得到上述遞推關系后,便可以寫了一個函數來計算f(n)。
? 測試用例可能很多,所以必須打表。
程序說明
? 函數setstairs()計算數列的各個項存儲在數組stairs[]中備用,函數是用遞推來實現。
要點詳解- 用函數封裝功能是一個好的做法。
- 能用遞推就不用遞歸,遞歸的代碼邏輯往往比遞推要簡潔,但是通常時間上要慢并且需要更多的存儲。
- 重復多次使用計算函數值時,如果函數是遞歸定義的,簡單地封裝函數會導致重復計算,通常用打表的方法來解決。這是一種套路,需要熟練掌握。
CCF NOI,
參考鏈接:HDU2041 超級樓梯。
100分通過的C語言程序:
#include <stdio.h>typedef unsigned long long ULL;#define N 30ULL stairs[N+1];void setstairs(int n)
{ULL s1=1, s2=2, temp;stairs[0] = 0;stairs[1] = 1;stairs[2] = 2;for(int i=3; i<=n; i++) {temp = s1 + s2;s1 = s2;s2 = temp;stairs[i] = s2;}
}int main(void)
{int n;setstairs(N);while(scanf("%d", &n) != EOF)printf("%lld\n", stairs[n]);return 0;
}