小U的最大连续移动次数问题
思路分析:
-
问题理解:
- 地图由一个
m x n的二维数组表示,每个元素代表一个高度。 - 小U只能交替进行上坡和下坡,且不能连续上坡或下坡。
- 每个位置只能经过一次,需要找到小U能移动的最大次数。
- 地图由一个
-
解题思路:
-
深度优先搜索 (DFS) :
- 每个位置作为起点,分别尝试上坡和下坡的移动方向。
- 在每次移动时,记录当前深度并更新最大深度。
-
状态存储与回溯:
- 通过一个
used数组记录是否访问过某位置,避免重复移动。 - 在搜索结束后,需要回溯到未使用状态。
- 通过一个
-
移动方向约束:
- 在上坡时(
direction = true),只能移动到比当前高度高的位置。 - 在下坡时(
direction = false),只能移动到比当前高度低的位置。
- 在上坡时(
-
-
实现步骤:
-
遍历每个位置
(i, j),将其作为起点,调用 DFS。 -
在 DFS 中:
- 递归尝试移动到符合条件的四个方向。
- 每次移动时,切换上坡或下坡的状态。
- 使用回溯机制恢复现场。
-
记录所有起点的最大深度并更新结果。
-
-
时间复杂度:
- 最坏情况下,每个位置都作为起点进行 DFS,时间复杂度为
O(m * n * 4^(m*n))。
- 最坏情况下,每个位置都作为起点进行 DFS,时间复杂度为
DNA序列编辑距离
思路分析:
-
问题理解:
- 将受损 DNA 序列
dna1转换为未受损 DNA 序列dna2,允许三种操作:增加、删除、替换。 - 需要计算最少编辑步骤。
- 将受损 DNA 序列
-
解题思路:
-
动态规划 (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个字符相同。
-
-
实现步骤:
- 初始化 DP 表,填充边界条件。
- 使用双重循环填充 DP 表,根据状态转移方程更新值。
- 返回
dp[len1][len2]即为结果。
-
时间复杂度:
- 状态转移需要遍历所有的
i和j,时间复杂度为O(len1 * len2)。 - 空间复杂度为
O(len1 * len2),但可以优化为一维数组降至O(len2)。
- 状态转移需要遍历所有的