侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【动态规划】最小路径和

GabrielxD
2022-10-22 / 0 评论 / 0 点赞 / 478 阅读 / 453 字
温馨提示:
本文最后更新于 2022-11-04,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

64. 最小路径和


给定一个包含非负整数的 m ×\times 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

解题

方法一:动态规划

思路

经典的动态规划问题:

  • 状态定义:dp[i][j]dp[i][j] 表示从 (0,0)(0, 0) 走到 (i,j)(i, j) 时的最小路径和。
  • 状态转移方程:dp[i][j]=min(dp[i1][j],dp[i][j1])+grid[i][j]dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
  • 初始状态:dpdp 数组的第一行和第一列为矩阵第一行和第一列的前缀和数组。

那么从左上到右下的最小路径和为 dp[m1][n1]dp[m - 1][n - 1]

代码

class Solution {
    static final int INF = 0x3f3f3f3f;

    public int minPathSum(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int[][] dp = new int[m][n];
        dp[0][0] = grid[0][0];
        for (int i = 1; i < m; ++i) dp[i][0] = dp[i - 1][0] + grid[i][0];
        for (int j = 1; j < n; ++j) dp[0][j] = dp[0][j - 1] + grid[0][j];
        for (int i = 1; i < m; ++i) {
            for (int j = 1; j < n; ++j) {
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }
        return dp[m - 1][n - 1];
    }
}
0

评论区