5.19变态跳台阶 - WisperDin/blog GitHub Wiki

描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

分析

关键:跳n阶台阶问题其实包含了跳比n小的台阶的子问题

其实是斐波那契数列的变式问题,而且可以使用动态规划的思想优化

  • 枚举 -- 以第一步的选择来枚举出每种台阶的跳法

当0阶的台阶时有1种跳法

当1阶的台阶时,只能先跳一步,又变成了0阶台阶问题,所以跳法为1

当2阶的台阶时,

  • 一开始可以跳一步,是1阶台阶问题,此时跳法有1种
  • 一开始可以跳两步,是0阶台阶的问题,此时跳法有1种

整理成式子

f(0)=1
f(1)=1
f(2)=f(2-1)+f(2-2)=f(1)+f(0)
f(3)=f(3-1)+f(3-2)+f(3-3)=f(2)+f(1)+f(0)
...

可以整理成

f(0)=1
f(1)=1
f(2)=f(1)+f(0)
f(3)=f(2)+f(2)=2*f(2)
...

所以通式

f(0)=1
f(1)=1
f(n)=f(n-1)*2 (n>=2)

实现

public class Solution {
    public int JumpFloorII(int target) {
        if(target<=1){
            return target;
        }
        int[] rec = new int[target+1];
        rec[0]=1;
        rec[1]=1;
        
        for(int i=2;i<=target;i++){
            rec[i] = rec[i-1]*2;
        }
        
        return rec[target];
    }
}