LeetCode·每日一题·931. 下降路径最小和·记忆化搜索
发布人:shili8
发布时间:2024-11-16 10:19
阅读次数:0
**下降路径最小和**
**记忆化搜索**
**问题描述**
给定一个由 `n x n` 矩阵组成的网格,其中每个单元格都有一个整数值。从左上角开始,向右或向下移动一步到达右下角。找到从左上角到右下角的最短路径和。
**示例**
* 输入: `[[1,2,3],[4,5,6],[7,8,9]]`
输出:`12`
* 输入: `[[1,3,5],[2,6,9],[3,6,9]]`
输出:`21`
**解决方案**
我们将使用记忆化搜索来解决这个问题。记忆化搜索是一种优化的递归算法,通过存储已经计算过的结果来避免重复计算。
class Solution: def minFallingPathSum(self, matrix): n = len(matrix) # 初始化 memoization 表格 memo = [[-1 for _ in range(n)] for _ in range(n)] def dfs(i, j): # 如果结果已经计算过,则直接返回 if memo[i][j] != -1: return memo[i][j] # 如果是第一行,则只考虑向右移动 if i ==0: memo[i][j] = matrix[i][j] + min(dfs(i, j+1), dfs(i, j-1)) return memo[i][j] # 如果是最后一行,则只考虑向左移动 elif i == n -1: memo[i][j] = matrix[i][j] + min(dfs(i, j+1), dfs(i, j-1)) return memo[i][j] # 否则,考虑向右和向左移动 else: memo[i][j] = matrix[i][j] + min(min(dfs(i+1, j+1), dfs(i+1, j)), min(dfs(i+1, j-1), dfs(i+1, j))) return memo[i][j] # 初始化结果表格 result = [[0 for _ in range(n)] for _ in range(n)] # 计算每个单元格的最小路径和 for i in range(n): for j in range(n): result[i][j] = dfs(i, j) # 返回最小路径和 return min(result[n-1])
**注释**
* `memo` 表格用于存储已经计算过的结果。
* `dfs` 函数用于递归地计算每个单元格的最小路径和。
* `result` 表格用于存储每个单元格的最小路径和。
**时间复杂度**
* 时间复杂度为 O(n^2),其中 n 是网格的大小。
**空间复杂度**
* 空间复杂度为 O(n^2),其中 n 是网格的大小。