问题描述:
给定一个包含非负整数的m x n
网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下
或者向右
移动一步。
示例:
输入:
[ [1,3,1],
[1,5,1],
[4,2,1]]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
问题分析:
标准动态规划题目,这样想,要求最后一个位置的最优值,怎么得到?很显然:min(上面, 左面) + 本身
,所以动态方程为:
dp[i][j] = dp[i][j] + min(dp[i-1][j], dp[i][j-1])
Python3实现:
# @Time :2018/11/27
# @Author :LiuYinxing
# 动态规划
class Solution:
def minPathSum(self, grid):
if not grid: return None
m, n = len(grid), len(grid[0]) # 行, 列
for i in range(1, m): # 处理边界 -- 第一列
grid[i][0] += grid[i-1][0]
for j in range(1, n): # 处理边界 -- 第一行
grid[0][j] += grid[0][j-1]
for i in range(1, m): # 计算dp[i][j] += min(dp[i-1][j], dp[i][j-1])
for j in range(1, n):
grid[i][j] += min(grid[i-1][j], grid[i][j-1])
return grid[-1][-1]
if __name__ == '__main__':
grid = [
[1, 3, 1],
[1, 5, 1],
[4, 2, 1]]
solu = Solution()
print(solu.minPathSum(grid))
声明: 总结学习,有问题或不妥之处,可以批评指正哦。