1. 问题背景与核心挑战
LeetCode 818赛车问题是一个典型的指令优化问题。题目要求我们控制一辆初始位置为0、速度为+1的赛车,通过最少的指令序列到达目标位置target。可用的指令只有两种:
- A(加速):position += speed,speed *= 2
- R(倒车):speed = -1(如果当前speed > 0)或 speed = 1(如果当前speed < 0)
这个问题的难点在于如何高效地找到最优指令序列。乍一看可能觉得可以用广度优先搜索(BFS)来暴力求解,但实际上面临着状态空间爆炸的问题——因为速度是指数级增长的,导致状态数量会急剧增加。
关键观察:连续执行k次'A'指令后,赛车会到达位置S_k = 2^k - 1,此时速度为2^k。这个数学性质是动态规划解法的基础。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态规划解法思路拆解
2.1 基础情况分析
当target正好等于2^k - 1时,解决方案显而易见:直接连续执行k次'A'指令即可。例如:
- target=3(2^2-1):AA(2步)
- target=7(2^3-1):AAA(3步)
但大多数情况下target不会这么"完美",这时就需要考虑更复杂的策略。
2.2 两种核心策略
对于一般的target,我们主要考虑两种策略:
策略一:冲过头再回头
- 执行n次'A',到达位置2^n - 1(刚好超过target)
- 执行1次'R'掉头
- 剩余距离:(2^n - 1) - target
- 递归求解剩余距离的最优解
总步数:n(加速) + 1(掉头) + dp[(2^n - 1) - target]
策略二:提前掉头试探
- 执行n-1次'A',到达位置2^(n-1) - 1(还未到target)
- 执行1次'R'掉头
- 执行m次'A'向后走(m从0到n-2)
- 再执行1次'R'转回正向
- 计算净前进距离:2^(n-1) - 2^m
- 剩余距离:target - (2^(n-1) - 2^m)
- 递归求解剩余距离
总步数:(n-1) + 1 + m + 1 + dp[剩余距离] = n + m + 1 + dp[...]
3. Java实现详解
java复制class Sol
