js实现动态规划之青蛙跳台阶问题

动态规划

思想:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。

斐波拉契数列

只考虑当前状态(因为它每一个状态逻辑都是一样的)

f(n)=f(n-1)+f(n-2)

function febol(n){
    if(n<=0) return -1;
    if(n == 1) return 0;
    if(n == 2) return 1;
    return febol(n-1)+febol(n-2);
}

青蛙跳台阶问题

  1. 正常型

问题:一个青蛙,一次只能跳一级台阶,或者跳两级台阶。
问:这个青蛙跳上n级台阶有多少种跳法。

思路: 如果这只青蛙,跳上了第n级台阶,那么最后一次跳跃之前,他一定在n-1级台阶或n-2级台阶上。

那么跳上n级台阶有多少种情况就变成了两个子问题:

  • 跳上n-1级台阶的跳法 加上
  • 跳上n-2级台阶的跳法。

// 按照此逻辑递推,跳上n-1级台阶可以拆解为两个子问题
// 既:跳上n-2级台阶的跳法 加上 跳上n-3级台阶的跳法

function jump(n){
    if(n<=0) return -1;
    if(n==1) return 1;
    if(n==2) return 2;
    return jump(n-1)+jump(n-2);
}

  1. 变态型

变态青蛙跳台阶:
这只青蛙,一次可以跳1级台阶、2级台阶、或n级台阶。问:这只青蛙,跳上n级台阶有多少种方法?

思路:f(n) = f(n-1) + f(n-2) + f(n-3) + …… + f(2) + f(1) + f(0)

function jump(n){
    if(n <= 0) return -1;
    if(n == 1) return 1;
    if(n == 2) return 2;
    var result=0;
    for(var i=1;i<n;i++){
        result+=jump(n-i);    
    }
    return result+1;//+1是青蛙原地蹦上去的那一次;
}
发布了10 篇原创文章 · 获赞 0 · 访问量 80

猜你喜欢

转载自blog.csdn.net/weixin_43310564/article/details/105353182
今日推荐