动态规划-变态跳台阶

一、题目描述
一只青蛙一次可以跳上 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为指数。

猜你喜欢

转载自blog.csdn.net/weixin_43502661/article/details/88615875