刷题-动态规划 | 豆包MarsCode AI刷题

26 阅读2分钟

小U的最大连续移动次数问题

思路分析:

  1. 问题理解

    • 地图由一个 m x n 的二维数组表示,每个元素代表一个高度。
    • 小U只能交替进行上坡和下坡,且不能连续上坡或下坡。
    • 每个位置只能经过一次,需要找到小U能移动的最大次数。
  2. 解题思路

    • 深度优先搜索 (DFS)

      • 每个位置作为起点,分别尝试上坡和下坡的移动方向。
      • 在每次移动时,记录当前深度并更新最大深度。
    • 状态存储与回溯

      • 通过一个 used 数组记录是否访问过某位置,避免重复移动。
      • 在搜索结束后,需要回溯到未使用状态。
    • 移动方向约束

      • 在上坡时(direction = true),只能移动到比当前高度高的位置。
      • 在下坡时(direction = false),只能移动到比当前高度低的位置。
  3. 实现步骤

    • 遍历每个位置 (i, j),将其作为起点,调用 DFS。

    • 在 DFS 中:

      • 递归尝试移动到符合条件的四个方向。
      • 每次移动时,切换上坡或下坡的状态。
      • 使用回溯机制恢复现场。
    • 记录所有起点的最大深度并更新结果。

  4. 时间复杂度

    • 最坏情况下,每个位置都作为起点进行 DFS,时间复杂度为 O(m * n * 4^(m*n))

DNA序列编辑距离

思路分析:

  1. 问题理解

    • 将受损 DNA 序列 dna1 转换为未受损 DNA 序列 dna2,允许三种操作:增加、删除、替换。
    • 需要计算最少编辑步骤。
  2. 解题思路

    • 动态规划 (DP)

      • 定义状态:

        • dp[i][j] 表示将 dna1 的前 i 个字符转换为 dna2 的前 j 个字符所需的最少操作数。
      • 状态转移方程:

        • 如果 dna1[i] == dna2[j],则不需要操作:dp[i][j] = dp[i-1][j-1]

        • 否则,取三种操作的最小值加一:

          • 替换:dp[i-1][j-1] + 1
          • 插入:dp[i][j-1] + 1
          • 删除:dp[i-1][j] + 1
    • 边界条件

      • dp[i][0] = i,将 dna1 的前 i 个字符删除到空。
      • dp[0][j] = j,将空字符插入到与 dna2 的前 j 个字符相同。
  3. 实现步骤

    • 初始化 DP 表,填充边界条件。
    • 使用双重循环填充 DP 表,根据状态转移方程更新值。
    • 返回 dp[len1][len2] 即为结果。
  4. 时间复杂度

    • 状态转移需要遍历所有的 ij,时间复杂度为 O(len1 * len2)
    • 空间复杂度为 O(len1 * len2),但可以优化为一维数组降至 O(len2)