[编程题] 基础 【动态规划】与练习-爬楼梯

[编程题] 基础 【动态规划】与练习-爬楼梯

知识点

1、基础

image-20200730150942845

2、斐波那契数列例子

普通递归:

image-20200730151623823

递归加记忆化

image-20200730151651407

那么从树的下边往上推的话,顺推上去没救得到了状态转移方法。

image-20200730151915995


案例1:爬楼梯

回溯的方法

回溯的思想是,我们如果是想到达第n台阶f(n)的话,那么就是从f(n-1)跳上来,也可以是从f(n-2)跳上来。即

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

f(0) = f(1) = 1

动态规划

for(int i=2;i<n;i++){

​ f[n] = f[n-1] + f[n-2];

}

总结:动态规划dp转移方程状态定义;dp转移方程

Java办法的几种代码

import java.util.*;
class Solution {

    //方法1:递归:(时间超过限制)
    public int climbStairs1(int n) {
        //方法1:普通递归的方法进行
        if(n==1 ||n==2) {
            return n;
        }else{
            return climbStairs(n-1)+climbStairs(n-2);
        }
    }

    //方法2:动态规划(空间换时间)
     public int climbStairs2(int n) {
        if(n<=2){return n;}
        //n>=3的情况使用dp处理
        int[] dp =  new int[n+1];
        dp[1] = 1;
        dp[2] = 2;
        for(int i=3;i<=n;i++){
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[n];
     }

    

     //方法3:滑动数组的方式(从左往右滑)
     public int climbStairs3(int n) {
         int p = 0;   //pre节点指针
         int q = 1;  //相当于n=1的情况的指针
         int r = 2;  //相当于n=2的情况的指针
         for(int i=1;i<n;i++){  //传入2,只需要移动1次,传入3,只需移动2次
             p = q;
             q = r;
             r = p+q;
         }
         return q;
    }

    //方法4:使用斐波那契公式计算
    public int climbStairs6(int n) {
        double sqrt5 = Math.sqrt(5);
        int res = (int)((1/sqrt5)*(Math.pow((1+sqrt5)/2,n+1)-Math.pow((1-sqrt5)/2,n+1)));
        return res;
    }

}
posted @ 2020-07-30 16:34  北鼻coder  阅读(529)  评论(0编辑  收藏  举报