题目描述

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

输入输出

DQN算法路径规划python leetcode 路径规划_动态规划

思路分析

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

动态规划

状态定义:dp[i][j]:从左上角->(i,j)的最短路径和
状态转移方程: \(dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]\)
边界情况:左边界:i≠0,j=0, \(dp[i][j] = dp[i-1][j] + grid[i][j]\)
边界情况:上边界:i=0,j≠0, \(dp[i][j] = dp[i][j-1] + 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]