给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。
题目标签:Array / Dynamic Programming
题目链接:LeetCode / LeetCode中国
动态规划。
F[i, j] = grid[i, j] + min(F[i+1, j], F[i, j+1])
Language | Runtime | Memory |
---|---|---|
python3 | 116 ms | N/A |
class Solution:
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m = len(grid)
if not m:
return 0
n = len(grid[0])
if not n:
return 0
dp = [[0] * n for _ in range(m)]
for i in range(m-1, -1, -1):
for j in range(n-1, -1, -1):
dp[i][j] = grid[i][j]
if i < m-1 and j < n-1:
dp[i][j] += min(dp[i+1][j], dp[i][j+1])
else:
if i < m-1:
dp[i][j] += dp[i+1][j]
if j < n-1:
dp[i][j] += dp[i][j+1]
return dp[0][0]