LeetCode 818. Race Car

题解

记忆化搜索。这题显然可以化为子问题来考虑的。
大体思路:
不妨设dp[n]为到达n的最短代码
注意可以直接A到且最短的位置为 1,3,7,15, … ,(2^n) -1
显然要考虑的情况就是target位于 2^(n-1) -1 ~ (2^n) -1 之间
怎么处理这个区间更进一步?两种方法。

  1. 走到target的后头位置(2^n) -1,此时调头向后走
    那么还需要走的的最短步数恰好= 后头位置与target的差距 dis 的 dp[dis]。
    向后移动与先前移动等长距离所耗步数是一样的。
dp[target] = dp[ (2^n) -1 - target] + n+1//+1 调头
  1. 走到target之前位置2^(n-1) -1,此时也调头,
    依次考虑调头走0-n-1步,再考虑新起点到target的距离。
for m=0-> n-1:
dp[target] = min( dp[target], 
dp[ target - (2^(n-1) -1 ) +(2^m -1) ] + n+m+1 )

注意实现代码中递归的写法。


Code

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];
    }

你可能感兴趣的:(LeetCode,动态规划)