題目出自:九度Online Judge
題目描述:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
- 輸入:
-
輸入可能包含多個測試樣例,對於每個測試案例,
輸入包括一個整數n(1<=n<=70)。
- 輸出:
-
對應每個測試案例,
輸出該青蛙跳上一個n級的臺階總共有多少種跳法。
- 樣例輸入:
-
5
- 樣例輸出:
-
8
-
直入主題,上代碼嘍~
-
我感覺需要注意兩點:
-
1. 注意結果的數據類型,用double纔不會產生越界;
-
2. 儘量不要使用遞歸方法,很容易超時,我用遞歸時超時了-_-!
-
import java.io.StreamTokenizer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.lang.Math; public class P1388 { public static void main(String[] args) throws IOException{ StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); while(st.nextToken() != StreamTokenizer.TT_EOF){ int n = (int)st.nval; int maxStep2Num = n/2; double totalWays = 0; for(int i=maxStep2Num; i>=0; i--){ int step2Num = i; int step1Num = n - i*2; int totalStepNum = step2Num+step1Num; int minStepNum = step2Num < step1Num?step2Num:step1Num; double rst1 = 1; double rst2 = 1; for(int j=0; j<minStepNum; j++){ rst1 *= (totalStepNum-1*j); rst2 *= (minStepNum-1*j); } totalWays += rst1/rst2; } System.out.println(Math.round(totalWays)); } } }
上面這種採用排列組合思想的方法雖然可以解決問題,實際上並不容易理解。這道題的關鍵在於發現規律,即找到遞推的通項公式。 -
記n級臺階有f(n)中走法,則有如下兩種情況:
-
1. 如果最後一步走1級臺階,則有f(n-1)種走法;
-
2. 如果最後一步走2級臺階,則有f(n-2)種走法;
-
因此,我們可以得到遞推的通項公式 f(n) = f(n-1) + f(n-2)
-
在此基礎上,既可求得最終結果,這個應該是最好的解決方案。