2025年--Lc188--931. 下降路径最小和(多维动态规划,矩阵)--Java版

1.题目



2.思路

因为这题的转移方向是"从上到下"(上一行的 j−1、j、j+1 到下一行 j),所以唯一需要的基线就是第一行:

dp[0][j] = matrix[0][j]。

之后第 i 行的任意列 j 都只依赖 上一行 的值(dp[i-1][*]),自然能算出来,包括第 0 列:

当 j == 0:dp[i][0] 由 dp[i-1][0](正上)和(若存在)dp[i-1][1](右上)转移得到。

当 0 < j < n-1:取 dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1] 的最小。

当 j == n-1:由 dp[i-1][n-1](正上)和(若存在)dp[i-1][n-2](左上)转移。

也就是说,第一列不是独立的"起点边界",它和其他列一样,都依赖"上一行"的结果,自然会被计算到;不需要像"从左到右/从上到下"的网格最短路(只能向右或向下)那样同时初始化第一行和第一列。

java 复制代码
dp[0][0] = matrix[0][0]           // 初始化第一行
dp[1][0] = min(dp[0][0], dp[0][1]) + matrix[1][0]
dp[2][0] = min(dp[1][0], dp[1][1]) + matrix[2][0]

约定是 dp[i][j]:i 是行(row),j 是列(column)。

dp[0] 在 Java 里表示第一行这一整行的一维数组;所以写成 dp[0] = [2, 1, 3] 就是说第一行的每一列值依次是 2、1、3,也就是 (0,0)、(0,1)、(0,2)。

java 复制代码
dp[0][0]  dp[0][1]  dp[0][2]   ← 这是第0行
dp[1][0]  dp[1][1]  dp[1][2]
dp[2][0]  dp[2][1]  dp[2][2]
↑  第0列

3.代码实现

java 复制代码
class Solution {
    public int minFallingPathSum(int[][] matrix) {
        //行数
        int m=matrix.length;
        //列数
        int n=matrix[0].length;
        int[][] dp=new int[m][n];
       
        // "从上到下",所以从第一行中的任何元素开始。初始化第一行:到达第一行的最小路径和就是其自身
        // 即 (0,0),(0,1),(0,2),代表矩阵数组中的第一组元素
       for(int j=0;j<n;j++)
       {
        dp[0][j]=matrix[0][j];
       }
       
        for(int i=1;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                //最左边的元素
                if(j==0)
                {
                    dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j+1])+matrix[i][j];
                }
                //最右边的元素
                else if(j==n-1)
                {
                    dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j-1])+matrix[i][j];
                }
                //中间正常元素
                else
                {
                    dp[i][j]=Math.min(Math.min(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+matrix[i][j];
                }
            }
        }
        int res=dp[m-1][0];//最后一行的第一个元素
        //找出最后一行的最小值
        for(int k=0;k<n;k++)
        {
            res=Math.min(res,dp[m-1][k]);
        }
        return res;

    }
}
相关推荐
代码or搬砖36 分钟前
公共字段抽取自动填充
android·java·数据库
老华带你飞40 分钟前
校园快递|基于Java校园快递管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
AndreasEmil2 小时前
JavaSE - 继承
java·开发语言·ide·vscode·intellij-idea·idea
后端小张2 小时前
【JAVA 进阶】SpringBoot自动配置机制:从原理到实践的深度解析
java·spring boot·后端·spring·spring cloud·自动配置·注解
毕设源码-赖学姐8 小时前
【开题答辩全过程】以 高校评教评学系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
老华带你飞8 小时前
博物馆展览门户|基于Java博物馆展览门户系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端
路边草随风8 小时前
iceberg 基于 cosn 构建 catalog
java·大数据
It's now8 小时前
Spring Framework 7.0 原生弹性功能系统讲解
java·后端·spring
点PY8 小时前
C++ 中 std::async 和 std::future 的并发性
java·开发语言·c++
一 乐8 小时前
人事管理系统|基于Springboot+vue的企业人力资源管理系统设计与实现(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·后端