📅  最后修改于: 2023-12-03 15:18:04.480000             🧑  作者: Mango
在一个NxN
的网格中,从左上角出发,到达右下角,每次只能向下或向右走一步,求最小路径上的所有元素之和。
这是一个典型的动态规划问题,可以采用记忆化搜索或者迭代求解的方式进行求解。
我们可以采用记忆化搜索的方式,从左上角开始递归,计算出到达当前位置的最小路径长度,并将其存储在一个二维数组中,避免重复计算。最终,我们返回右下角的最小路径长度即可。
以下是使用 Python 实现的记忆化搜索的代码:
def minPathSum(grid):
memo = [[-1] * len(grid[0]) for _ in range(len(grid))]
def dfs(i, j):
if i < 0 or j < 0:
return float('inf')
if i == 0 and j == 0:
return grid[0][0]
if memo[i][j] != -1:
return memo[i][j]
memo[i][j] = grid[i][j] + min(dfs(i-1, j), dfs(i, j-1))
return memo[i][j]
return dfs(len(grid)-1, len(grid[0])-1)
我们可以采用迭代求解的方式,从左上角开始向右和向下逐一计算到达每个位置的最小路径长度,并将其存储在一个二维数组中。最终,我们返回右下角的最小路径长度即可。
以下是使用 Python 实现的迭代求解的代码:
def minPathSum(grid):
m, n = len(grid), len(grid[0])
dp = [[0] * n for _ in range(m)]
dp[0][0] = grid[0][0]
for i in range(1, m):
dp[i][0] = dp[i-1][0] + grid[i][0]
for j in range(1, n):
dp[0][j] = dp[0][j-1] + grid[0][j]
for i in range(1, m):
for j in range(1, n):
dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])
return dp[-1][-1]
以上就是 NxN 网格中的最小求和下降路径的介绍和实现。