818. Race Car
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的更多相关文章
- 【leetcode最短路】818. Race Car
https://leetcode.com/problems/race-car/description/ 1. BFS剪枝 0<=current position<=2*target.为什么 ...
- LeetCode 818. Race Car
原题链接在这里:https://leetcode.com/problems/race-car/ 题目: Your car starts at position 0 and speed +1 on an ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- leetcode hard
# Title Solution Acceptance Difficulty Frequency 4 Median of Two Sorted Arrays 27.2% Hard ...
- Promise.race
[Promise.race] 返回最先完成的promise var p1 = new Promise(function(resolve, reject) { setTimeout(resolve, 5 ...
- golang中的race检测
golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...
- 【BZOJ-2599】Race 点分治
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 2590 Solved: 769[Submit][Status ...
- hdu 4123 Bob’s Race 树的直径+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- Codeforces Round #131 (Div. 2) E. Relay Race dp
题目链接: http://codeforces.com/problemset/problem/214/E Relay Race time limit per test4 secondsmemory l ...
随机推荐
- KVO键值监听
KVO 键值监听:当我想知道一个对象的属性是否发生改变的时候 做出响应,就需要添加监听keypath 和 key的区别keypath会自动寻找子类的属性key只会寻找当前类的属性添加键值监听[pers ...
- phonegap制作windows phone包
下载SDK win7及以下版本下载SDK http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=27570 WIN8下载SDK ht ...
- CreateWaitableTimer和SetWaitableTimer
负值表示相对时间,正值表示绝对时间,定时器精度为100ns (1ns=1/10亿 s),所以 -50000000 代表5秒,详见MSDN. 程序一为自动重置(先等待5秒,然后每1秒输出一次): #in ...
- 解决CentOS遇到Qt编译(error: cannot find -lGL)
笔者CentOS 6.5 64位,安装完成Qt5.5.1.随意新建一个Qt Widgets Application. 结果遇到Qt编译问题,提示信息如下: error: cannot find -lG ...
- Oracle、SqlServer——基础知识——oracle 与 SqlServer 的区别(未完工)
一. oracle 与 SqlServer 的区别: 类别 oracle SqlServer 连接字符串 || + 变量 变量名 @变量名 初始赋值 := = SQL语句赋值 into = 绑定变量 ...
- 使用matplotlib的示例:调整字体-设置刻度、坐标、colormap和colorbar等
使用matplotlib的示例:调整字体-设置刻度.坐标.colormap和colorbar等 2013-08-09 19:04 27805人阅读 评论(1) 收藏 举报 分类: Python(71 ...
- js正则基础总结和工作中常用验证规则
知识是需要系统的.就像js正则用了那么多次,却还是浑浑噩噩,迫切需要来一次整理,那么来吧! 基本知识 元字符 \d 匹配数字等于[0-9] \w 匹配字母.数字.下划线.中文 \s 匹配任意空白字符 ...
- jQuery选择器整理
最使用近工作中常用到jQuery,在过滤器的使用方面生疏,所以本文整理了些有关知识点,以便于自己查找方便,或为朋友们提供方便! 一.基本选择器 $("#test") 选取id为te ...
- DAY16-Django之model
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- DAY3-python函数
目录 一.了解函数 二. 函数定义 三.函数使用原则:先定义,后调用 四.定义函数的三种形式 五.函数的调用 六.函数的参数 七. 函数对象 八.函数嵌套 九.名称空间与作用域 十. 闭包函数 十一. ...