当前位置:实例文章 » 其他实例» [文章]LC-931 下降路径最小和(记忆化搜索 ==> 动态规划)

LC-931 下降路径最小和(记忆化搜索 ==> 动态规划)

发布人:shili8 发布时间:2024-11-15 13:45 阅读次数:0

**LC-931: 下降路径最小和**

**题目描述**

给定一个由整数组成的二维数组 `grid`,其中每个元素都有一个值。我们需要找到从左上角到右下角的路径中,所有数字之和最小的路径。

**记忆化搜索**

首先,我们可以使用记忆化搜索来解决这个问题。记忆化搜索是一种优化的递归方法,它通过存储已经计算过的结果来避免重复计算,从而提高效率。

def minFallingPathSum(grid):
 memo = {}

 def dfs(i, j):
 if (i, j) in memo:
 return memo[(i, j)]
 # Base case: 如果到达右下角,直接返回当前值 if i == len(grid) -1 and j == len(grid[0]) -1:
 return grid[i][j]
 # 递归计算左、上和左上三个方向的最小值 left = dfs(i, j +1)
 top = dfs(i +1, j)
 topLeft = dfs(i +1, j +1)

 # 将当前值加上最小值,存储结果 memo[(i, j)] = grid[i][j] + min(left, top, topLeft)
 return memo[(i, j)]

 # 从左上角开始递归计算 return dfs(0,0)


**动态规划**

然而,我们可以使用动态规划来优化这个问题。动态规划是一种更高效的方法,它通过预先计算所有可能的结果来避免重复计算。

def minFallingPathSum(grid):
 rows = len(grid)
 cols = len(grid[0])

 # 初始化第一行和第二行 dp = [[0] * cols for _ in range(rows)]
 dp[0][0] = grid[0][0]
 # 计算第一行 for j in range(1, cols):
 dp[0][j] = grid[0][j] + dp[0][j -1]

 # 计算第二行 for i in range(1, rows):
 dp[i][0] = grid[i][0] + dp[i -1][0]
 # 计算剩余部分 for i in range(1, rows):
 for j in range(1, cols):
 dp[i][j] = grid[i][j] + min(dp[i -1][j], dp[i][j -1], dp[i -1][j -1])

 # 返回最小值 return min(dp[-1])


**总结**

在本题中,我们使用了记忆化搜索和动态规划两种方法来解决问题。记忆化搜索是一种优化的递归方法,它通过存储已经计算过的结果来避免重复计算,从而提高效率。动态规划是一种更高效的方法,它通过预先计算所有可能的结果来避免重复计算。

**参考**

* [LC-931: 下降路径最小和]( />* [记忆化搜索]( />* [动态规划](

相关标签:算法动态规划
其他信息

其他资源

Top