题干
给定一个包含非负整数的 *m* x *n* 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
**说明:**每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
解法:动规
这道题实际上是计算路径上的最小值,所以我们第一个想到的也是动态规划。
我们使用动规五部曲来分析以下整个流程:
1. 找到dp[i]数组以及下标的含义:dp[i][j]表示到达i,i位置的最小值。
2. 总结递推公式:因为我们只能向下或向右移动,所以我们的动规公式为dp[i][j]=min(dp[i-1][j],dp[i][j-1])+dp[i][j]
注意在两个边界时没有右或上的情况,所以要分类讨论
3. dp数组如何初始化:dp数组的尺寸应与gird数组相同
4.确定遍历的顺序:从零点处向后遍历
代码实现:
执行用时:128 ms, 在所有 JavaScript 提交中击败了8.15%的用户
内存消耗:44.7 MB, 在所有 JavaScript 提交中击败了5.03%的用户
var minPathSum = function (grid) {
let m = grid[0].length;
let n = grid.length;
let dp = [...grid];
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (i == 0 && j == 0) {
continue
}
if (i == 0) {
dp[i][j] = dp[i][j - 1] + dp[i][j]
console.log()
} else if (j == 0) {
dp[i][j] = dp[i - 1][j] + dp[i][j]
} else {
dp[i][j] = dp[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1])
}
}
}
return dp[n - 1][m - 1]
};