代码随想录算法训练营Day38|动态规划理论基础、509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

一、动态规划理论基础

动态规划五部曲:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

 

二、509 斐波那契数

1. 题目链接:力扣

2. 思路:按动规五部曲走,思路见代码

3. 代码:

var fib = function(n) {
    // 1.dp数组与下标的含义:dp[i]是存放第i个斐波那契数的
    // 2.状态转移方程:dp[i] = dp[i - 1] + dp[i - 2]
    // 3.初始化:dp[0] = 0,dp[1] = 1
    // 4.遍历顺序:dp[i]依赖于前两个值,那么从前向后遍历
    // 5.举例推导dp数组
    var dp = [];
    dp[0] = 0;
    dp[1] = 1;
    for (let i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
};

三、70 爬楼梯

1. 题目链接:力扣

2. 思路:dp[i]是爬i层楼梯的方法数,dp[i] = dp[i - 1] + dp[i - 2],dp[0] = 0,dp[1] = 1, dp[2] = 2

3. 代码:

var climbStairs = function(n) {
    var dp = [];
    dp[0] = 0;
    dp[1] = 1;
    dp[2] = 2;
    for (let i=3; i<=n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
};

四、746 使用最小花费爬楼梯

1. 题目链接:力扣

2. 思路:dp[i]指的是到达第i级台阶花费的最小体力,dp[i] = min(dp[i - 1]+cost[i - 1], dp[i - 2]+cost[i - 2],初始化时,跳到第0级和第1级都是可以直接开始的,因此dp[0]和dp[1]都是0。

3. 代码:

var minCostClimbingStairs = function(cost) {
    var dp = [];
    dp[0] = 0;
    dp[1] = 0;
    var n = cost.length;
    for (let i=2; i<=n; i++) {
        var num1 = dp[i - 2] + cost[i - 2];
        var num2 = dp[i - 1] + cost[i - 1];
        dp[i] = num1 < num2 ? num1 : num2;
    }
    return dp[n];
};

总结:今日学习时长1h左右,目前还比较简单

你可能感兴趣的:(算法训练营,算法,动态规划,数据结构)