码迷,mamicode.com
首页 > 编程语言 > 详细

算法52-----矩阵最小路径【动态规划】

时间:2018-11-17 16:00:45      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:新建   not   turn   grid   mat   self   说明   min   def   

一、题目:矩阵最小路径

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

说明:每次只能向下或者向右移动一步。

示例:

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

思路1:时间O(M*N),空间O(M*N)

新建一个矩阵dp(大小也是M*N),该矩阵是从上往下,从左往右记录每一步的结果的,当前的结果可以根据该矩阵上面和左边最小的值来获得,即:

dp[i][j] = min(dp[i][j-1],dp[i-1][j]) + grid[i][j]

如:

grid =

[ [1,3,1],
  [1,5,1],
  [4,2,1]]

dp = 

[[1,4,5],
  [2,7,6],
  [6,8,7]]

 

 

 

 

所以结果为dp[-1][-1] = 7

代码:

    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        #使用二维数组
        if not grid or not grid[0]:
            return 0
        matrix = list(zip(*grid))
        if len(grid) <= 1:
            return sum(grid[0])
        if len(matrix) <= 1:
            return sum(matrix[0])
        dp = [[0]*len(grid[0]) for i in range(len(grid))]
        dp[0][0] = grid[0][0]
        for i in range(1,len(grid)):
            dp[i][0] = grid[i][0] + dp[i-1][0]
        for j in range(1,len(grid[0])):
            dp[0][j] = grid[0][j] + dp[0][j-1] 
        for i in range(1,len(grid)):
            for j in range(1,len(grid[0])):
                dp[i][j] = min(dp[i][j-1],dp[i-1][j]) + grid[i][j]
        return dp[-1][-1]

 

思路2:时间O(M*N),空间O( min(M,N) )

新建一个列表dp(大小为min(M,N)),循环行数次更新记录每一行的路径值。

如:

grid =

[ [1,3,1],
  [1,5,1],
  [4,2,1]]

第一次更新:dp = [1,4,5]

第二次更新:dp = [2,7,6],比如:原本dp =  [1,4,5],然后 先将 dp[0] 更新为2,然后dp[1] : 【min ( dp[0] 和dp [1] ) 与grid [1][1]相加之和】来更新 dp [1]

第三次更新:dp = [6,8,7]

更新是根据:

dp[j] = min(dp[j-1],dp[j]) + grid[i][j]

代码:

        #使用一维数组
        if not grid or not grid[0]:
            return 0
        if len(grid) <= 1:
            return sum(grid[0])
        if len(grid[0]) <= 1:
            return sum([val[0] for val in grid])
        n = min(len(grid),len(grid[0]))
        m = len(grid) if n == len(grid[0]) else len(grid[0])
        dp = [0] * n
        dp[0] = grid[0][0]
        if n == len(grid):
            grid = list(zip(*grid))
        for i in range(1,n):
            dp[i] = grid[0][i] + dp[i-1]
        for i in range(1,m):
            for j in range(n):
                dp[j] = min(dp[j-1],dp[j]) + grid[i][j] if j>=1 else dp[j] + grid[i][j]
        return dp[-1]

算法52-----矩阵最小路径【动态规划】

标签:新建   not   turn   grid   mat   self   说明   min   def   

原文地址:https://www.cnblogs.com/Lee-yl/p/9973770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!