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

Posted lee-yl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法52-----矩阵最小路径动态规划相关的知识,希望对你有一定的参考价值。

一、题目:矩阵最小路径

给定一个包含非负整数的 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-----矩阵最小路径动态规划的主要内容,如果未能解决你的问题,请参考以下文章

动态规划专题2:矩阵的最小路径和

数据结构与算法题解|动态规划|——矩阵型动态规划

[动态规划与回溯算法] 路径问题

[动态规划与回溯算法] 路径问题

算法学习之动态规划(求矩阵连乘最小相乘次数)

动态规划-矩阵最短路径