92.最小路径和

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

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

示例1:
image

输入: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] <= 200

代码:

class Solution {
    public int minPathSum(int[][] grid) {
        //m:网格行数
        //n:网格列数
        int m = grid.length,n = grid[0].length; 
        //创建动态规划表,dp[i][j]表示到达(i,j)位置的最小路径和
        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&&j!=0)dp[i][j] = dp[i][j-1]+grid[i][j];
                //第一列:只能从上方到达
                else if(i!=0&&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];
    }
}
posted @ 2025-05-09 19:37  回忆、少年  阅读(7)  评论(0)    收藏  举报