【DP】LeetCode 64. 最小路径和
题目链接
思路
分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律
表示状态
假设到了右下角,考虑一下我们要存储的信息
- 走到最后坐标的最小步数
- 当前坐标的信息,用来判断是否走到了右下角
很容易联想到使用二维数组 dp[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];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了