📜  NxN网格中的最小求和下降路径(1)

📅  最后修改于: 2023-12-03 15:18:04.480000             🧑  作者: Mango

NxN网格中的最小求和下降路径

在一个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 网格中的最小求和下降路径的介绍和实现。