2025年--Lc186--64. 最小路径和(多维动态规划,矩阵)--Java版

1.题目


2.思路

(1)dp[i][j]的定义:从起点(0,0)到位置(i,j)的最小路径和

(2)dp[i][j]的递推公式:对于位置(i,j)只能从(i-1,j)或(i,j-1)走过来。所以dp[i,j]=grid[i][j]+Math.min(dp[i-1][j],dp[i][j-1]).

grid[i][j]是消耗当前格子的值,Math.min(dp[i-1][j],dp[i][j-1])是从上走或从左走的路径最小值。

(3)初始化:

起点到起点的路径和(即当前格子)dp[0][0]=grid[0][0]

第一行(从左走来)

dp[0][j]=dp[0][j-1]+grid[0][j]

第一列(从上走来)

dp[i][0]=dp[i-1][0]+grid[i][0]

(4)遍历顺序:从上到下,从左到右

3.代码实现

java 复制代码
class Solution {
    public int minPathSum(int[][] grid) {
        //行数
        int m=grid.length;
        //列数
        int n=grid[0].length;
        //边界情况,只有一行或者只有一列,这样就无法从左上角走到右下角,所以最小路径和为0
        if(m==0||n==0)
        {return 0;}
         //定义dp数组
        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]=grid[i][j]+Math.min(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[m-1][n-1];
    }
}```
相关推荐
雨中飘荡的记忆9 分钟前
深入理解设计模式之单例模式
java·设计模式
程序员西西17 分钟前
Spring Boot整合MyBatis调用存储过程?
java·后端
2501_9418798128 分钟前
Python在微服务高并发异步API网关请求处理与智能路由架构中的实践
java·开发语言
AAA简单玩转程序设计30 分钟前
Java进阶小白手册:基础玩法升级,告别青铜套路
java
whltaoin31 分钟前
【 手撕Java源码专栏 】Spirng篇之手撕SpringBean:(包含Bean扫描、注册、实例化、获取)
java·后端·spring·bean生命周期·手撕源码
用户3721574261351 小时前
使用 Java 删除 Word 文档中的水印
java
艾斯比的日常1 小时前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
空空kkk1 小时前
MyBatis——代理Dao方式的增删改查操作
java·数据库·mybatis
Seven971 小时前
线性数据结构
java
带刺的坐椅1 小时前
Solon 不依赖 Java EE 是其最有价值的设计!
java·spring·web·solon·javaee