0
点赞
收藏
分享

微信扫一扫

【动态规划】64. 最小路径和

知年_7740 2022-04-17 阅读 63

题目:

力扣

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:


输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12
 

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100

题解:

步骤:

1.dp含义

设 dp 为大小 m×n 矩阵,其中 dp[i][j] 的值代表走到 (i,j) 的最小路径和。

2.转移方程

题目要求,只能向右或向下走,换句话说,当前单元格 (i,j) 只能从左方单元格 (i-1,j) 或上方单元格 (i,j-1)走到,因此只需要考虑矩阵左边界和上边界。

具体分为以下 4 种情况:

  • 当左边和上边都不是矩阵边界时:dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];即上方单元格与左方单元格最小值和当前单元格之和
  • 当只有左边是矩阵边界时: dp[i][j] = dp[i - 1][j] +grid[i][j];即上方单元格与当前单元格之和
  • 当只有上边是矩阵边界时:dp[i][j] = dp[i][j - 1] + grid[i][j];即左方单元格与当前单元格之和
  • 当左边和上边都是矩阵边界时:dp[i][j] = grid[i][j];其实就是起点

3.初始

dp[][]初始为0

4.遍历方向

从转移方程的分析中得到从左边、上方来,按照从左到右、从上往下的顺序遍历

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (i == 0 && j == 0) { //当左边和上边都是矩阵边界时,其实就是起点
                    dp[i][j] = grid[i][j];
                } else if (i == 0) { //当只有上边是矩阵边界时
                    dp[i][j] = dp[i][j - 1] + grid[i][j];
                } else if (j == 0) { //当只有左边是矩阵边界时
                    dp[i][j] = dp[i - 1][j] +grid[i][j];
                } else { //当左边和上边都不是矩阵边界时
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
                }
            }
        }
        return dp[m - 1][n - 1];
    }
}

参考:力扣

举报

相关推荐

0 条评论