【DP】LeetCode 64. 最小路径和

题目链接

64. 最小路径和

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

表示状态

假设到了右下角,考虑一下我们要存储的信息

  • 走到最后坐标的最小步数
  • 当前坐标的信息,用来判断是否走到了右下角

很容易联想到使用二维数组 dp[i][j] 来表示在坐标 (i,j) 处的最小步数。

找状态转移方程

因为只能往下或者往右走。所以在遍历到一个格子时,看看上面和左面的格子哪个值小就取哪个。

dp[i][j]=min(dp[i1][j],dp[i][j1])+grid[i][j]

边界处理

我们只需要处理第一行和第一列就行。

第一行处理为

dp[0][i] =  i == 0 ? grid[0][i] : grid[0][i] + dp[0][i - 1];

第一列处理为

dp[i][0] =  i == 0 ? grid[i][0] : grid[i][0] + dp[i - 1][0];

代码

class Solution {
    public int minPathSum(int[][] grid) {
        // dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
        int[][] dp = new int[grid.length][grid[0].length];
        for(int i = 0; i < dp[0].length; i++){
            dp[0][i] =  i == 0 ? grid[0][i] : grid[0][i] + dp[0][i - 1];
        }
        for(int i = 0; i < dp.length; i++){
            dp[i][0] =  i == 0 ? grid[i][0] : grid[i][0] + dp[i - 1][0];
        }

        for(int i = 1; i < grid.length; i++){
            for(int j = 1; j < grid[i].length; j++){
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }

        return dp[grid.length - 1][grid[0].length - 1];
    }
}
posted @   Frodo1124  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示