参考链接:https://www.cnblogs.com/qisfj/p/leecode818.html
采用动态规划方法解题,
设dp[t]表示target为t时,最少需要的步数。
将连续的n次A操作改变的position记为nA,很显然,+iA-jA+kA等价于+kA-jA+iA,同时+iA+kA等价于+kA+iA。所以当存在一串操作使position始终没有超过t,那么可以首先尽量尝试达到position,也就是说在position+speed<tposition+speed<t的情况下,
继续A操作依然可以保证有必要遍历的情况被遍历了。
假设t的二进制表示一共有i位,则iA即可影响到最高位,不需要有(i+1)A,因为若是出现了(i+1)A就必然影响了i+1位,为了使i+1位保持0由以下几种方式,
若之前执行的是+(i+1)A,那么就执行-(i+1)A,执行两次+iA,但无疑都多出了许多无意义的操作。
所以要达到一个t,若存在n使得2n−1=t2n−1=t成立,此n就是最佳的步数。否则,设n使2n−1−1<target<2n−12n−1−1<target<2n−1成立,则t可以从以下两种的一种中到达。
先到达2n−12n−1再经过一个R操作和dp[2n−1−t2n−1−t]次操作回到t。
先到达2n−1−12n−1−1再经过R操作、i个A操作、R操作、dp[t−2n−1+2it−2n−1+2i]操作回到t,其中i<n−1
class Solution {
public:
int dp[10001];
int racecar(int t){
if (dp[t] != 0)
return dp[t];
int n = floor(log2(t)) + 1;
if (1 << n == t + 1) dp[t] = n;
else {
dp[t] = n + 1 + racecar((1 << n) - 1 - t);//2^n-1、R、dp[2^n-1-t]
for (int i = 0; i<n - 1; i++)//2^{n-1}-1、R、i个A、R、dp[t-2^{n-1}+2^i}]
dp[t] = min(dp[t], n + i + 1 + racecar(t - (1 << (n - 1)) + (1 << i)));
}
return dp[t];
}
};
2n−1