-
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题目出自:九度Online Judge
题目描述:
-
输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数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)
-
在此基础上,既可求得最终结果,这个应该是最好的解决方案。