AI刷题:最长递减路径节点数查找 | 豆包MarsCode AI 刷题

66 阅读3分钟

题解:最长递减路径

在给定一个二维网格的情况下,我们需要找到一条最长的递减路径。路径上的每个节点值都必须严格递减,并且只能上下左右移动,不能走对角线,也不能走出网格的边界。这个问题可以通过深度优先搜索(DFS)结合动态规划(DP)的方法来解决。

问题分析

  1. 路径递减:路径上的每个节点值都必须严格递减,这意味着我们不能从一个较大的值跳到另一个较大的值或相等的值。
  2. 移动限制:只能上下左右移动,这限定了搜索的方向。
  3. 边界条件:不能走出网格的边界,这需要在搜索过程中进行边界检查。

算法设计

  1. 数据结构选择

    • 二维数组 grid:用于存储网格的值。
    • 二维数组 dp:用于存储每个节点的最长递减路径长度。初始值设为 -1,表示该节点还未计算。
  2. 算法步骤

    • 深度优先搜索 (DFS) :从每个节点开始,使用 DFS 探索所有可能的路径。

      • 对于每个节点,检查其四个相邻节点(上、下、左、右)。
      • 如果相邻节点的值小于当前节点的值,则递归调用 DFS。
    • 动态规划 (DP) :在 DFS 的过程中,使用 dp 数组记录每个节点的最长递减路径长度。

      • 如果某个节点的最长递减路径长度已经计算过(即 dp[row][col] != -1),则直接返回该值,避免重复计算。
    • 遍历整个网格:对网格中的每个节点调用 DFS,并记录全局的最长递减路径长度。

  3. 关键点

    • 记忆化搜索:通过 dp 数组避免重复计算,提高效率。
    • 边界检查:在 DFS 过程中,确保相邻节点在网格内且值小于当前节点。

算法实现

我们使用一个嵌套的 for 循环来遍历整个网格,对每个节点调用 DFS 函数。DFS 函数会检查四个相邻节点,并递归调用自身,同时更新 dp 数组和最长路径长度。

测试与验证

通过提供的测试样例,我们可以验证算法的正确性。例如:

  • solution(3, 3, [[9, 6, 4], [5, 6, 7], [2, 1, 1]]) 应该返回 5。
  • solution(4, 4, [[10, 9, 8, 7], [6, 5, 4, 3], [7, 6, 5, 4], [8, 7, 6, 5]]) 应该返回 6。
  • solution(2, 2, [[-1, -2], [-3, -4]]) 应该返回 3。

总结

这个问题通过结合深度优先搜索(DFS)和动态规划(DP)的方法,有效避免了重复计算,提高了算法的效率。记忆化搜索的使用使得每个节点只被计算一次,大大减少了计算量。同时,边界检查和路径递减条件的处理也确保了算法的正确性。通过合理的算法设计和实现,我们可以高效地解决最长递减路径的问题。