leetcode-最小路径和

 


题目描述

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

输入输出

image

思路分析

遇到统计可行路径的数量问题,或者求最小路径,一般有两种方法,搜索和动态规划
注: 搜索一般在数据规模比较小的时候使用。复杂度比较高,在本题中: 2m+n。故采用动态规划

动态规划

状态定义:dp[i][j]:从左上角->(i,j)的最短路径和
状态转移方程dp[i][j]=min(dp[i1][j],dp[i][j1])+grid[i][j]
边界情况:左边界:i≠0,j=0, dp[i][j]=dp[i1][j]+grid[i][j]
边界情况:上边界:i=0,j≠0, dp[i][j]=dp[i][j1]+grid[i][j]
初始状态:dp[0][0] = grid[0][0]

代码实现:

class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
# if not grid or not grid[0]:
# return 0
m,n = len(grid),len(grid[0])
dp = [[0]*n for _ in range(m)]
# 起始节点
dp[0][0] = grid[0][0]
# 动态规划填表
for i in range(m):
for j in range(n):
if i==j==0:
continue
# 上边界
elif i==0:
dp[i][j] = dp[i][j-1]+grid[i][j]
# 左边界
elif j==0:
dp[i][j] = dp[i-1][j]+grid[i][j]
else:
# 状态转移方程
dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]
return dp[m-1][n-1]
posted @   topbookcc  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示