青蛙跳臺階

題目出自:九度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)
在此基礎上,既可求得最終結果,這個應該是最好的解決方案。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章