动规算法采用了 代码随想录 的动规五部曲的步骤来做 代码随想录
LC 746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例 1:
输入:cost = [10,15,20] 输出:15 解释:你将从下标为 1 的台阶开始。 - 支付 15 ,向上爬两个台阶,到达楼梯顶部。 总花费为 15 。
示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1] 输出:6 解释:你将从下标为 0 的台阶开始。 - 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。 - 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。 - 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。 - 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。 - 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。 - 支付 1 ,向上爬一个台阶,到达楼梯顶部。 总花费为 6 。
解题思路:使用动规五部曲。到达当前楼梯 i 有两种方法,一种由 i - 1来,一种由 i - 2来。
代码:
var minCostClimbingStairs = function(cost) { let dp = [cost[0], cost[1]]; for(let i = 2; i < cost.length; i++) { dp[i] = Math.min(dp[i - 1] + cost[i], dp[i - 2] + cost[i]); //将当前值与上一个值和当前值与上二个值进行对比,选取最小的。 } return Math.min(dp[cost.length -1], dp[cost.length - 2]) //返回倒一和倒二中最小的值 };
LC 62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7 输出:28
示例 2:
输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3 输出:28
示例 4:
输入:m = 3, n = 3 输出:6
解题思路:动规五部曲。递归公式:每一个 (i,j)位置都是从(i-1,j)或者(i,j-1)而来的
代码:
var uniquePaths = function(m, n) { let dp = Array(m).fill().map(item => Array(n)); //创建二维数组 for(let i = 0; i < m; i++) { dp[i][0] = 1; //将每行第一个的路径值都设为 1 } for(let i = 0; i < n; i++) { dp[0][i] = 1; //将每列第一个的路径值都设为 1 } for (let i = 1; i < m; ++i) { for (let j = 1; j < n; ++j) { dp[i][j] = dp[i - 1][j] + dp[i][j - 1] //每个dp[i][j] 都从 dp[i-1][j] 或 dp[i][j - 1]来的 } } return dp[m - 1][n - 1] };