[leetcode]818. Race Car

本文介绍了一个经典的算法问题——赛车问题,目标是最小化到达指定位置所需的指令序列长度。通过两种策略进行求解:一是直接超越目标再返回;二是尽可能接近目标后再调整方向返回。文章详细解释了递归算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:https://leetcode.com/problems/race-car/description/


Your car starts at position 0 and speed +1 on an infinite number line.  (Your car can go into negative positions.)

Your car drives automatically according to a sequence of instructions A (accelerate) and R (reverse).

When you get an instruction "A", your car does the following: position += speed, speed *= 2.

When you get an instruction "R", your car does the following: if your speed is positive then speed = -1 , otherwise speed = 1.  (Your position stays the same.)

For example, after commands "AAR", your car goes to positions 0->1->3->3, and your speed goes to 1->2->4->-1.

Now for some target position, say the length of the shortest sequence of instructions to get there.

Example 1:
Input: 
target = 3
Output: 2
Explanation: 
The shortest instruction sequence is "AA".
Your position goes from 0->1->3.
Example 2:
Input: 
target = 6
Output: 5
Explanation: 
The shortest instruction sequence is "AAARA".
Your position goes from 0->1->3->7->7->6.

 

Note:

  • 1 <= target <= 10000.

n is the length of target in binary and we have 2 ^ (n - 1) <= target < 2 ^ n

We have 2 strategies here:
1. Go pass our target , stop and turn back
We take n instructions of A.
1 + 2 + 4 + ... + 2 ^ (n-1) = 2 ^ n - 1
Then we turn back by one R instruction.
In the end, we get closer by n + 1 instructions.

2. Go as far as possible before pass target, stop and turn back
We take N - 1 instruction of A and one R.
Then we take m instructions of A, where m < n

class Solution {  
public:  
    int racecar(int target) {  
        if (dp[target] > 0) {                       // already calculated before  
            return dp[target];  
        }  
        int n = floor(log2(target)) +1;  
        if (1 << n == target + 1) {                 // perfect solution: just use someting like "AAA...AR"  
            dp[target] = n;  
        }  
        else {                                      // need to go back using the same strategy  
            dp[target] = racecar((1 << n) - 1 - target) + n + 1;    // 1. Go pass our target , stop and turn back
            for (int m = 0; m < n - 1; ++m) {  
                dp[target] = min(dp[target], racecar(target - (1 << (n - 1)) + (1 << m)) + n + m + 1);  // 2. Go as far as possible before pass target, stop and turn back
            }  
        }  
        return dp[target];  
    }  
private:  
    int dp[10001];  
};  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值