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 ...
随机推荐
- 使用case语句给字体改变颜色
使用case语句给字体改变颜色 #!/bin/bash color(){ RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1; ...
- ramfs, rootfs and initramfs
ramfs, rootfs and initramfs October 17, 2005 Rob Landley <rob@landley.net> =================== ...
- PCIe相关的操作命令
1.lspci --显示列举系统目前的pcie设备 43:00.0 Class 0004: Device 104c:b800 (rev 01) //netra设备 设备编号 ...
- spring容器启动的三种方式
一.在Web项目中,启动Spring容器的方式有三种,ContextLoaderListener.ContextLoadServlet.ContextLoaderPlugin. 1.1.监听器方式: ...
- Java-API-Package:java.util
ylbtech-Java-API-Package:java.util 1.返回顶部 1. java.util Interfaces Collection Comparator Deque Enumer ...
- python window使用paramiko简单监控数据指标数据采集
#!/usr/bin/python #-*- coding: utf-8 -*- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- 最全 C 语言常用算法详解-排序-队列-堆栈-链表-递归-树 (面试有用)
具体 源代码 案例查看github,持续更新中............ github地址:https://github.com/Master-fd/C-Algorithm 1. 二分法查找 2. 冒泡 ...
- js分页demo
纯js实现分页 原理:所有数据已加载好,js通过遍历部分显示,实现分页效果 html代码 <html> <head> <meta charset='utf-8'> ...
- python操作excel的读写
1.下载xlrd和xlwt pip install xlwd pip install xlrd pip install xlutils 2.读写操作(已存在的excel) #-*- coding:ut ...
- 【Android异常】The specified child already has a parent. You must call removeView() on the child's parent first.
错误信息: Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must ...