818. 赛车
题目描述
你的赛车可以从位置 0
开始,并且速度为 +1
,在一条无限长的数轴上行驶。赛车也可以向负方向行驶。赛车可以按照由加速指令 'A'
和倒车指令 'R'
组成的指令序列自动行驶。
- 当收到指令
'A'
时,赛车这样行驶:position += speed
speed *= 2
- 当收到指令
'R'
时,赛车这样行驶:- 如果速度为正数,那么
speed = -1
- 否则
speed = 1
- 如果速度为正数,那么
例如,在执行指令 "AAR"
后,赛车位置变化为 0 --> 1 --> 3 --> 3
,速度变化为 1 --> 2 --> 4 --> -1
。
给你一个目标位置 target
,返回能到达目标位置的最短指令序列的长度。
示例 1:
输入:target = 3 输出:2 解释: 最短指令序列是 "AA" 。 位置变化 0 --> 1 --> 3 。
示例 2:
输入:target = 6 输出:5 解释: 最短指令序列是 "AAARA" 。 位置变化 0 --> 1 --> 3 --> 7 --> 7 --> 6 。
提示:
1 <= target <= 104
解法
方法一:动态规划
设 $dp[i]$ 表示到达位置 $i$ 的最短指令序列的长度。答案为 $dp[target]$。
对于任意位置 $i$,都有 $2^{k-1} \leq i \lt 2^k$,并且我们可以有三种方式到达位置 $i$:
- 如果 $i$ 等于 $2^k-1$,那么我们可以直接执行 $k$ 个
A
指令到达位置 $i$,此时 $dp[i] = k$; - 否则,我们可以先执行 $k$ 个
A
指令到达位置 $2^k-1$,然后执行R
指令,剩余距离为 $2^k-1-i$,此时 $dp[i] = dp[2^k-1-i] + k + 1$;我们也可以先执行 $k-1$ 个A
指令到达位置 $2^{k-1}-1$,然后执行R
指令,接着执行 $j$(其中 $0 \le j \lt k$) 个A
,再执行R
,剩余距离为 $i - 2^{k-1} + 2^j$,此时 $dp[i] = dp[i - 2^{k-1} + 2^j] + k - 1 + j + 2$。求出 $dp[i]$ 的最小值即可。
时间复杂度 $O(n \log n)$,其中 $n$ 为 $target$。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|