# 0818. Race Car
###### tags: `Leetcode` `Hard` `Dynamic Programming`
Link: https://leetcode.com/problems/race-car/
## 思路
参考[这里](https://leetcode.com/problems/race-car/discuss/123834/JavaC%2B%2BPython-DP-solution)
有两个方法能到target点
Let's say ```n``` is the length of target in binary and we have ```2^(n - 1) <= target < 2^n```
1. **Go pass our target , stop and turn back** 走n步超过target点 再用一个R折返 走回target
2. **Go as far as possible before pass target, stop and turn back** 走n-1步 再用一个R折返 接着往反方向走m步 再转向走回target
## Code
```java=
class Solution {
int[] dp = new int[10001];
public int racecar(int target) {
if(dp[target]!=0) return dp[target];
int n = (int)(Math.log(target)/Math.log(2))+1;
if(target+1==1<<n) return dp[target]=n;
dp[target] = racecar((1<<n)-target-1)+1+n;
for(int m=0; m<n-1; m++){
dp[target] = Math.min(dp[target], racecar(target-(1<<(n-1))+(1<<m))+n+m+1);
}
return dp[target];
}
}
```