Loading

Leetcode - 64. 最小路径和

给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解1 2021/9/9 O(mxn)

def udpate_shang_zuo(dp:list, x:int, y:int, m:int, n:int, grid:list) -> None:
    # 更新上格
    ### 错误 - 1
    #if x>0 and dp[x-1][y]==0:
    if x>0 and dp[x-1][y]==-1:
        ## =0的就别处理了,说明还没准备好
        #if dp[x][y]==0 or (y<n-1 and dp[x-1][y+1]==0): return
        if dp[x][y]==-1 or (y<n-1 and dp[x-1][y+1]==-1): return
    ### 错误 - 1
        if y<n-1:
            dp[x-1][y]=grid[x-1][y]+min(dp[x-1][y+1],dp[x][y])
        else:
            dp[x-1][y]=grid[x-1][y]+dp[x][y]
        udpate_shang_zuo(dp, x - 1, y, m, n, grid)
    # 更新左格
    ### 错误 - 1
    #if y>0 and dp[x][y-1]==0:
    if y>0 and dp[x][y-1]==-1:
        ## =0的就别处理了,说明还没准备好
        #if dp[x][y]==0 or (x<m-1 and dp[x+1][y-1]==0): return
        if dp[x][y]==-1 or (x<m-1 and dp[x+1][y-1]==-1): return
    ### 错误 - 1
        if x<m-1:
            dp[x][y-1]=grid[x][y-1]+min(dp[x+1][y-1],dp[x][y])
        else:
            dp[x][y-1]=grid[x][y-1]+dp[x][y]
        udpate_shang_zuo(dp, x, y - 1, m, n, grid)
    # 从调试看,=0不处理,最终结果是对的,不会中途停掉,不会漏,暂时没有理解

def minPathSum(grid: list) -> int:
    # 和62题一样,直接拿过来改吧改吧
    # f(x,y)=grid[x][y] + min(f(x,y+1),f(x+1,y))
    # m,n∈[1,200]
    m=grid.__len__()
    n=grid[0].__len__()
    if m==1:
        return sum(grid[0])
    if n==1:
        res=0
        for x in grid:
            res+=x[0]
        return res
    ### 错误 - 1
    #dp=[[0 for x in range(0,n)] for y in range(0,m)]
    dp=[[-1 for x in range(0,n)] for y in range(0,m)]
    ### 错误 - 1
    x=m-1;y=n-1
    dp[x][y]=grid[x][y]
    # 从某个位置,可以推出上面和左边,得递归了,推到全是墙为止
    udpate_shang_zuo(dp,x,y,m,n,grid)
    return dp[0][0]

if __name__ == '__main__':
    # 7
    grid = [[1, 3, 1], [1, 5, 1], [4, 2, 1]]
    print(minPathSum(grid))
    # 12
    grid = [[1, 2, 3], [4, 5, 6]]
    print(minPathSum(grid))
    grid = [[1, 2, 3]]
    print(minPathSum(grid))
    grid = [[1],[2]]
    print(minPathSum(grid))
    grid = [[2]]
    print(minPathSum(grid))
    ### 错误
    # 1 改吧改吧还是会出问题的,这里是计算路径,本身grid就是有0的情况,这样dp需要初始化为-1
    grid=[[0, 1], [1, 0]]
    print(minPathSum(grid))

posted @ 2021-09-09 17:52  wwcg2235  阅读(39)  评论(0)    收藏  举报