一、题目描述:
一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级… 它也可以跳上 n 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
二、解题思路:
解法一:动态规划,定义一个动态数组dp[],跳上第一个台阶的跳法数量dp[0]=1;跳上第二个台阶的跳法数量dp[1]=2;跳上第三个台阶的跳法数量dp[2]=4;现在要跳上第四个台阶,可以先跳上第三个台阶,再经过一次跳跃(跳一个台阶)实现,这里最后一次跳法固定(板上钉钉的事),其方法数量dp1[3]=dp[2];也可以先跳上第一个台阶或者第二个台阶,再经过一次跳跃直接上第四个台阶,此时,由于越过第三个台阶,则可将第四个台阶认为是第三个台阶,其方法数量dp2[3]=dp[2]。
解法二:数学分析,
1.若要跳上n阶台阶,可以从n-1阶台阶跳1个台阶上去,也可以从n-2阶台阶跳2个台阶上去,…,可以从1阶台阶跳n-1个台阶上去,得到如下公式:
f(n) = f(n-1) + f(n-2) + … + f(0) (1)
2.同理,若要跳上n-1阶台阶,可以从n-2阶台阶跳1个台阶上去,也可以从n-3阶台阶跳2个台阶上去,…,可以从1阶台阶跳n-2个台阶上去,得到如下公式:
f(n-1) = f(n-2) + f(n-3) + … + f(0) (2)
(1)-(2)得:f(n) - f(n-1) = f(n-1),f(n) = 2*f(n-1)
可知,f(n)是等比数列。
三、代码:
解法一:
public int JumpFloorII(int target) {
int[] dp = new int[target];
Arrays.fill(dp, 1);
for (int i = 1; i < target; i++)
for (int j = 0; j < i; j++)
dp[i] += dp[j];
return dp[target - 1];
}
解法二:
public int JumpFloorII(int target) {
return (int) Math.pow(2, target - 1);
}
四、Java基础:
Math.pow(base,exponent);
说明:base为基数,exponent为指数。