/**

  • 题目9:变态跳台阶
  • 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
  • /
//解法1:递归破解,时间、空间复杂度O(n^n),O(1)[这里不太清楚]  24ms
public int sum_9=0;
public void jump_9(int target){
    if(target<=0){
        if(target==0) sum_9++;
        return;
    }
    for(int i=1;i<=target;i++)
        jump_9(target-i);
}

//解法1的简化版       19ms
public int jump_9_simple(int target){
    if(target==0) return 1;
    int cnt=0;
    for(int i=0;i<target;i++)
        cnt+=jump_9_simple(i);
    return cnt;
}

/**解法2:利用公式,时间、空间复杂度O(n)、O(1)     16ms
 * 设跳第n阶梯的跳法数量是F(n),那么F(n)=1+F(n-1)+F(n-2)+...+F(1)=2F(n-1)=2^(n-1)
 */
public int jump_9_2(int target){
    return 1<<(target-1);
}

/**
 * 解法3:动态规划,时间、空间复杂度O(n^2)、O(n)     16ms
 * (1)第n个状态都包含直接跳到第n步的跳法(0另外做讨论)
 * (2)第n个状态是前n-1种状态+直接跳n步的方法
 */
public int jump_9_3(int target){
    int [] res=new int[target+1];
    Arrays.fill(res,1);
    res[0]=0;
    for(int i=2;i<=target;i++){
        for(int j=i-1;j>=1;j--) res[i]+=res[j];
    }
    return res[target];
}