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.

Approach #1: C++. [DFS]

class Solution {
public:
int racecar(int target) {
queue<pair<int, int>> q;
q.push({0, 1});
unordered_set<string> v;
v.insert("0_1");
v.insert("0_-1");
int steps = 0;
while (!q.empty()) {
int size = q.size();
while (size--) {
auto p = q.front(); q.pop();
int pos = p.first;
int speed = p.second;
{
int pos1 = pos + speed;
int speed1 = speed * 2;
pair<int, int> p1{pos1, speed1};
if (pos1 == target) return steps+1;
if (p1.first > 0 && p1.first < 2 * target)
q.push(p1);
}
{
int speed2 = speed > 0 ? -1 : 1;
pair<int, int> p2{pos, speed2};
string key2 = to_string(pos) + "_" + to_string(speed2);
if (!v.count(key2)) {
q.push(p2);
v.insert(key2);
}
}
}
steps++;
}
return -1;
}
};

  

Approach #2: Java. [DP]

class Solution {
private static int[][] m;
public int racecar(int target) {
if (m == null) {
final int kMaxT = 10000;
m = new int[kMaxT + 1][2];
for (int t = 1; t <= kMaxT; ++t) {
int n = (int)Math.ceil(Math.log(t + 1) / Math.log(2));
if (1 << n == t + 1) {
m[t][0] = n;
m[t][1] = n + 1;
continue;
}
int l = (1 << n) - 1 - t;
m[t][0] = n + 1 + Math.min(m[l][1], m[l][0] + 1);
m[t][1] = n + 1 + Math.min(m[l][0], m[l][1] + 1);
for (int i = 1; i < t; ++i) {
for (int d = 0; d <= 1; ++d) {
m[t][d] = Math.min(m[t][d], Math.min(
m[i][0] + 2 + m[t-i][d],
m[i][1] + 1 + m[t-i][d]));
}
}
}
}
return Math.min(m[target][0], m[target][1]);
}
}

  

Approach #3: Python. [DP]

class Solution(object):
def __init__(self): self.dp = {0: 0} def racecar(self, t):
"""
:type target: int
:rtype: int
"""
if t in self.dp: return self.dp[t]
n = t.bit_length()
if 2**n - 1 == t: self.dp[t] = n
else:
self.dp[t] = self.racecar(2**n - 1 - t) + n + 1
for m in range(n-1):
self.dp[t] = min(self.dp[t], self.racecar(t - 2**(n-1) + 2**m) + n + m + 1)
return self.dp[t]

  

Analysis:

http://zxi.mytechroad.com/blog/dynamic-programming/leetcode-818-race-car/

818. Race Car的更多相关文章

  1. 【leetcode最短路】818. Race Car

    https://leetcode.com/problems/race-car/description/ 1. BFS剪枝 0<=current position<=2*target.为什么 ...

  2. LeetCode 818. Race Car

    原题链接在这里:https://leetcode.com/problems/race-car/ 题目: Your car starts at position 0 and speed +1 on an ...

  3. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

  4. leetcode hard

    # Title Solution Acceptance Difficulty Frequency     4 Median of Two Sorted Arrays       27.2% Hard ...

  5. Promise.race

    [Promise.race] 返回最先完成的promise var p1 = new Promise(function(resolve, reject) { setTimeout(resolve, 5 ...

  6. golang中的race检测

    golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...

  7. 【BZOJ-2599】Race 点分治

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 2590  Solved: 769[Submit][Status ...

  8. hdu 4123 Bob’s Race 树的直径+rmq+尺取

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  9. Codeforces Round #131 (Div. 2) E. Relay Race dp

    题目链接: http://codeforces.com/problemset/problem/214/E Relay Race time limit per test4 secondsmemory l ...

随机推荐

  1. PHP7卓越性能背后的原理有哪些?

    作者:韩天峰链接:http://www.zhihu.com/question/38148900/answer/75115687来源:知乎 PHP7在运行原理上与PHP5相比并没有变化,这与hhvm不同 ...

  2. ramfs, rootfs and initramfs

    ramfs, rootfs and initramfs October 17, 2005 Rob Landley <rob@landley.net> =================== ...

  3. git 学习 多个提交用同一个commit

    git add .git commit --amend(连续按连个ZZ)git push -f origin ibm_branch(命令行可能不好用,用IDEA force push好用)

  4. js生成邀请码(2)

    //生成邀请码方法一 /*function createInviteCode() { var s = [],a=6,b=10; var chars = "123456789QWERTYUIP ...

  5. 火星坐标、百度坐标、WGS84坐标转换代码(JS)

    JS版本源码 /** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ / ...

  6. DAY19-Pillow制作验证码

    PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修 ...

  7. 计算数组arr中所有元素的和

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. ImageView 的 ScaleType

    /** * Options for scaling the bounds of an image to the bounds of this view. 将一个图片的边界缩放到这个view边界的几种选 ...

  9. Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor

    Bitmap bmp =BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); Paint paint = new ...

  10. 【总结整理】WebGIS学习-thinkGIS(二):关于level,比例尺scale,分辨率resolution

    1.Level包含了一个resolution参数和一个scale参数 瓦片本身: 我们用arcgis切完图后,打开发布的服务或者打开config.xml配置文件,可以看到所切之图的相关配置.如图所示: ...