递归与动态规划---矩阵的最小路径和
2017-08-12 00:06
323 查看
【题目】
给定一个矩阵m,从左上角开始每次都只能向下或者向右走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。
【基本思路】
生成和m同样大小的矩阵dp,dp[i][j]的值表示从左上角走到位置(i, j)的最小路径和,矩阵的第一行和第一列的值可以先确定,其他的位置dp[i][j]的值等于min(dp[i-1][j], dp[i][j-1]) + m[i][j]。
给定一个矩阵m,从左上角开始每次都只能向下或者向右走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。
【基本思路】
生成和m同样大小的矩阵dp,dp[i][j]的值表示从左上角走到位置(i, j)的最小路径和,矩阵的第一行和第一列的值可以先确定,其他的位置dp[i][j]的值等于min(dp[i-1][j], dp[i][j-1]) + m[i][j]。
#python3.5 #经典动态规划实现 def minPathSum1(m): if m == None or len(m) == 0 or m[0] == None or len(m[0]) == 0: return 0 dp = [[0 for i in range(len(m[0]))] for j in range(len(m))] dp[0][0] = m[0][0] for i in range(1, len(m[0])): dp[0][i] = dp[0][i-1] + m[0][i] for j in range(1, len(m)): dp[j][0] = dp[j-1][0] + m[j][0] for i in range(1, len(m)): for j in range(1, len(m[0])): dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + m[i][j] return dp[len(m)-1][len(m[0])-1] #经过空间压缩的动态规划 def minPathSum2(m): if m == None or len(m) == 0 or m[0] == None or len(m[0]) == 0: return 0 more = max(len(m), len(m[0])) less = min(len(m), len(m[0])) rowmore = True if more == len(m) else False dp = [0 for i in range(less)] dp[0] = m[0][0] for i in range(1, less): dp[i] = dp[i-1] + m[0][i] if rowmore else m[i][0] for i in range(1, more): dp[0] = dp[0] + m[i][0] if rowmore else m[0][i] for j in range(1, less): dp[j] = min(dp[j-1], dp[j]) + m[i][j] if rowmore else m[j][i] return dp[less-1]
相关文章推荐
- 动态规划--矩阵最小路径和
- 动态规划-----矩阵最小路径和
- 动态规划---三角矩阵最小路径
- 动态规划-矩阵最小路径和
- 利用动态规划,求数值矩阵左上角至右下角最小路径
- 动态规划(三)暴力递归的优化之路——数字矩阵的最小路径和
- 动态规划实例(六):最小花费路径
- 基础算法 | 回溯和递归--矩阵中的路径(编程之美)
- 矩阵的最小路径和
- 动态规划之矩阵路径问题
- 算法_动态规划_矩阵路径最大和
- 矩阵最小路径和
- 矩阵最小路径和问题(升级版)
- 动态规划--矩阵最小的路径和
- LeetCode -- Triangle 路径求最小和( 动态规划问题)
- 矩阵中的路径—递归
- 动态规划之矩阵的最小路径和
- 递归,动态规划,找最短路径,Help Jimmy
- 矩阵的最小路径和(空间压缩)
- 经典算法题:数字三角形寻找最大路径——动态规划和递归调用两种解法