返回

最小路径和:优化每一步,助力最终胜利

后端

最小路径和的原理

最小路径和算法的基本思想是利用动态规划的思想,将问题分解成一系列子问题,然后逐步求解这些子问题,最终得到问题的整体解。在最小路径和问题中,子问题就是从网格的某个位置走到另一个位置的最小路径和。我们可以使用动态规划的经典方法,将子问题的解存储在一个表格中,以便在求解其他子问题时重用这些解。

具体来说,我们可以创建一个 m x n 的表格,其中_m_和_n_分别是网格的行数和列数。表格中的每个单元格存储从网格的左上角走到该单元格的最小路径和。我们可以使用以下递推关系来计算每个单元格的值:

dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

其中,dp[i][j] 表示从网格的左上角走到单元格 (i, j) 的最小路径和,grid[i][j] 表示单元格 (i, j) 的值。

我们可以在表格的第一行和第一列中初始化 dp 表格的值。第一行和第一列的单元格只有一个路径可以到达它们,因此它们的最小路径和就是它们本身的值。

for (int i = 0; i < m; i++) {
  dp[i][0] = grid[i][0];
}

for (int j = 0; j < n; j++) {
  dp[0][j] = grid[0][j];
}

接下来,我们可以使用递推关系来计算表格中其他单元格的值。

for (int i = 1; i < m; i++) {
  for (int j = 1; j < n; j++) {
    dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
  }
}

最后,表格的右下角单元格的值就是从网格的左上角走到右下角的最小路径和。

int minPathSum = dp[m-1][n-1];

代码实现

以下是用 Python 实现的最小路径和算法:

def min_path_sum(grid):
  """
  计算网格中从左上角到右下角的最小路径和。

  参数:
    grid: 一个包含非负整数的 _m_ x _n_ 网格。

  返回:
    从网格的左上角走到右下角的最小路径和。
  """

  # 初始化 _dp_ 表格。
  m, n = len(grid), len(grid[0])
  dp = [[0 for _ in range(n)] for _ in range(m)]

  # 初始化表格的第一行和第一列。
  for i in range(m):
    dp[i][0] = grid[i][0]

  for j in range(n):
    dp[0][j] = grid[0][j]

  # 使用递推关系计算表格中其他单元格的值。
  for i in range(1, m):
    for j in range(1, n):
      dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

  # 返回表格的右下角单元格的值。
  return dp[m-1][n-1]


# 测试最小路径和算法。
grid = [[1, 3, 1], [1, 5, 1], [4, 2, 1]]
print(min_path_sum(grid))  # 输出:7

总结

最小路径和算法是一个经典的动态规划算法。它可以帮助我们在网格中找到从左上角到右下角的路径,使得路径上的数字总和为最小。最小路径和算法的原理是将问题分解成一系列子问题,然后逐步求解这些子问题,最终得到问题的整体解。最小路径和算法可以用代码轻松实现,并且可以在许多实际问题中得到应用。