记忆化搜索。这题显然可以化为子问题来考虑的。
大体思路:
不妨设dp[n]为到达n的最短代码
注意可以直接A到且最短的位置为 1,3,7,15, … ,(2^n) -1
显然要考虑的情况就是target位于 2^(n-1) -1 ~ (2^n) -1 之间
怎么处理这个区间更进一步?两种方法。
dp[target] = dp[ (2^n) -1 - target] + n+1//+1 调头
for m=0-> n-1:
dp[target] = min( dp[target],
dp[ target - (2^(n-1) -1 ) +(2^m -1) ] + n+m+1 )
注意实现代码中递归的写法。
int f[10001]={0};
int racecar(int t) {
if(f[t]>0) return f[t];
int n = floor(log2(t)) +1;
if((1<<n) == t+1) f[t] = n;
else{
f[t] = racecar( (1<<n) - 1 - t) + n+1;
for(int m=0;m<n-1;m++){
f[t]=min(f[t], racecar( t - (1<<(n-1)) +(1<<m) )+n+m+1);
}
}
return f[t];
}