818. Race Car

文章目录

  • 1 题目理解
  • 2 BFS
  • 3 dp
    • 3.1 基本情况
    • 3.2 递归方程分析
      • 3.2.1 先超过target再调头
      • 3.2.2 不超过target
  • 4 说明

1 题目理解

先讲规则。一辆小汽车停在位置0,并且方向朝向右侧,并且速度为1。小汽车每次可以选择加速A,那加速一次,新的位置=原来位置+速度,并且新的速度=速度*2。小汽车也可以选择掉头。掉头一次的话,新的位置=原来的位置,并且新的速度=如果原来速度>0,那就是-1,否则的话是1。
输入:int target。
输出:小汽车到达位置target最少需要几次操作。
例子:
Example 1:
Input:
target = 3
Output: 2
Explanation:
最短的操作顺序 是: “AA”.
汽车位置变化为: 0->1->3.

Example 2:
Input:
target = 6
Output: 5
Explanation:
最短的操作顺序 是 “AAARA”.
汽车位置变化为 0->1->3->7->7->6.

题目分析思路来源于花花酱。

2 BFS

因为在每个位置上,有两种操作。在每次操作后速度、位置会发生变化。一直变,直到走到终点。所以可以按照BFS求解。遇到的第一个位置为target,就是最短的操作。
这里有几个关键点。
关键点1:如果相同的位置和速度已经加入过队列,那就不需要再次计算。
关键点2:如果在位置0,小汽车朝向右侧一定比朝向左侧用的操作最少。这个可以用反证法证明。
关键点3:小汽车向右走,可以超过target,但 不能超过2*target。否则操作数会更多。
当然这个方法是不能AC的。

class Solution {public int racecar(int target) {Queue<int[]> queue = new LinkedList<int[]>();List<String> filter = new ArrayList<String>();queue.offer(new int[]{0,1});//pos speedfilter.add(0+"_"+1);filter.add("0_-1");int step = 0;while(!queue.isEmpty()){int size = queue.size();for(int i=0;i<size;i++){int[] values = queue.poll();int pos = values[0];int speed = values[1];//Aint newpos = pos + speed;if(newpos == target){return step + 1;}if(pos < 2*target){queue.offer(new int[]{newpos,speed*2});filter.add(newpos+"_"+(speed*2));}//Rif(speed >=0 ){speed = -1;}else{speed = 1;}String key = pos+"_"+speed;if(!filter.contains(key)){queue.offer(new int[]{pos,speed});filter.add(key);}}step++;}return -1;}
}

通过这个方法我们知道在同一位置可能有两种状态:速度向右、速度向左。这提示我们在做动态规划的时候可能需要维护二维数组。

3 dp

如果target=7,我们发现

操作位置速度
起始01
第1次A12
第2次A34
第3次A78

3.1 基本情况

如果target=2n−1target = 2^n-1target=2n1,那么到达target的最少操作数是n。是dp中的基本情况。

在这里插入图片描述

3.2 递归方程分析

如果不是,则可能要考虑两种情况。第一种情况是先走过5达到7,因为7的最少操作数可以直接求解,是基本情况。然后再调头,需要走2个位置达到5。如果我们提前计算好了走距离2的最少操作数,那就可以求解了。第二种情况是可能走到j=1,2,3,4,然后再走剩下的距离。操作数之和就是达到5的操作数。两种情况求最小值就是答案。下面分别讨论。

令dp[i][0]表示从0达到位置i并且速度朝右的最小操作数。dp[i][1]表示从0达到位置i并且速度朝左的最小操作数。

3.2.1 先超过target再调头

例如上面到达7,再返回达到5的时候可能速度方向朝左,也可能朝右。
dp[7][0]=3,dp[7][1]=4。
达到7调头,这时候操作数是4。
继续走2个距离,这时候的操作数是dp[2][0],这个时候的方向是朝左的。也就是说dp[5][1]= 4 + dp[2][0]。为什么是dp[2][0]而不是dp[2][1]呢?dp[2][0]表示从0到达2,并且方向向右,又因为起始位置速度的方向也向右,所以可以认为走过2个位置,并且方向和起始方向相同的最少操作数是dp[2][0]。当到达7以后调头,方向向左了,走过2个距离并且速度方向一致,那操作数就是dp[2][0]。
当然dp[5][1],也可能是通过dp[2][1]获得,这个时候需要再加一个转向操作,所以dp[5][1]=4+dp[2][1]+1。两者取最小值。dp[5][1] = 4 + min(dp[2][0],dp[2][1]+1)。
同理,可以推出dpp[5][0] = 4 + min(dp[2][1],dp[2][0]+1)。

推出一般情况就是:
l=2n−1−targetl=2^n-1-targetl=2n1target
dp[target][0]=n+1+min(dp[l][1],dp[l][0]+1)dp[target][0] = n +1 + min(dp[l][1],dp[l][0]+1)dp[target][0]=n+1+min(dp[l][1],dp[l][0]+1)
dp[target][1]=n+1+min(dp[l][0],dp[l][1]+1)dp[target][1] = n +1 + min(dp[l][0],dp[l][1]+1)dp[target][1]=n+1+min(dp[l][0],dp[l][1]+1)

3.2.2 不超过target

再参考上图target=5,如果不超过5。
那我们可以先走距离1,到达1以后再走距离4。到达5。
我们也可以先走距离2,到达2以后再走距离3。到达5。

我们也可以先走距离4,到达4以后再走距离1。到达5。

我们先分析先走距离1,到达1以后再走距离4。到达5的情况。达到1,如果方向向右,则需要先 调头,再调头,然后走距离4。那么dp[5][0] = dp[1][0]+2 + dp[4][0]。达到1,如果方向向左,则需要先调头,然后走距离4。那么dp[5][0] = dp[1][1]+1 + dp[4][0]。最终dp[5][0] = min(dp[1][1]+1,dp[1][0]+2) + dp[4][0]。
同理:dp[5][1] = min(dp[1][1]+1,dp[1][0]+2) + dp[4][1]。

最终代码

class Solution {public int racecar(int target) {int[][] dp = new int[target+1][2];dp[0][0] = 0;dp[0][1] = 1;for(int i=1;i<=target;i++){int n = (int)Math.ceil(Math.log(i+1)/Math.log(2));if((1<<n)  == i+1){dp[i][0] = n;dp[i][1] = n+1;}else{int left = ((1<<n)-1 - i);dp[i][0] = n+1+Math.min(dp[left][1],dp[left][0]+1);dp[i][1] = n+1+Math.min(dp[left][0],dp[left][1]+1);for(int j = 1;j<i;j++){int min = Math.min(dp[j][0]+2,dp[j][1]+1);dp[i][0]  =  Math.min(dp[i][0], min+dp[i-j][0]);dp[i][1]  =  Math.min(dp[i][1], min+dp[i-j][1]);}}}return Math.min(dp[target][0],dp[target][1]);}
}

4 说明

看到题目还是应该拿着具体数值分析一下。在某一特定情况下是怎么到达目的地的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring mvc学习(8):springmvc常用注解代码

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

python-if条件判断与while/for循环

条件判断if 让计算机像人一样&#xff0c;能判断是非对错&#xff0c;根据条件做一些事情。 if ------ if代码结构&#xff1a;------- if 条件:代码体tips&#xff1a;同一缩进范围内的代码被视作同一代码体,python官方推荐python缩进一次为4个空格is_happy True if is_happ…

第八十二期:掌握这些监控报警优化技巧,百万年薪不在话下!

运维工程师面试者第一个问题是&#xff1a;需要值班吗?笔者自己也曾经历过月入十万的时期&#xff0c;在那个时候&#xff0c;数个系统同时发布下一代版本&#xff0c;而老系统还需要过渡很长时间&#xff0c;工作量直接翻倍。 作者&#xff1a;焦振清 运维工程师面试者第一…

dp按照规模分类总结

本文章的内容来源于花花酱dp2。 做多了dp的题目之后总觉得有什么规律&#xff0c;但是自己没总结出来。花花酱按照输入规模、子问题个数、在解决一个问题的时候需要依赖的子问题个数为特征对题目做了分类。 其中绿色是比较简单的 &#xff0c;黄色是中等的&#xff0c;粉色是…

看了交大自产的电影《我的太阳》

呵呵&#xff0c;现在大学生自导自拍自演的电影越来越多了&#xff0c;不知道算是中国第几代导演&#xff1a;&#xff09; 我看电影一般比较关注情节&#xff0c;演技暂且不提。因为是校园电影&#xff0c;本片自然比较接近大学生生活&#xff0c;总体情节比较浪漫曲折(虽然部…

第八十三期:这些高性能负载均衡架构知识点,90%的人分不清!

单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。 作者&#xff1a;马天池 单服务器无论如何优化&#xff0c;无论采用多好…

第八十四期: Java、Web 和移动程序员学习的 12 个框架

今天的文章中&#xff0c;我将分享一些你可以学习的框架&#xff0c;以提升你在移动和Web开发以及大数据技术方面的知识。 作者&#xff1a;芒果教你学编程 在今天的文章中&#xff0c;我将分享一些你可以学习的框架&#xff0c;以提升你在移动和Web开发以及大数据技术方面的…

关于mysql无法添加中文数据的问题以及解决方案

所有能设置的地方我都设置了&#xff0c;都设置的是ut8。然后&#xff0c;我执行了一下insert语句&#xff0c;报错了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 这个错误纠结了一天&#xff0c;最后&#xff0c;看到…

第八十五期:一文彻底搞懂cookie和session

在Web发展史中&#xff0c;我们知道浏览器与服务器间采用的是 http协议&#xff0c;而这种协议是无状态的&#xff0c;所以这就导致了服务器无法知道是谁在浏览网页&#xff0c;所以为了解决这一问题&#xff0c;先后出现了四种技术&#xff0c;分别是隐藏表单域&#xff0c;UR…

Microsoft Updater Application Block 1.5.3 服务器端manifest文件设计 [翻译]

Microsoft Updater Application Block 服务器端manifest文件设计 译者&#xff1a;Tony Qu Manfest文件用于列出一次升级所需要的所有的文件&#xff0c;它与验证签名相关联&#xff0c;验证签名可用于验证manifest文件的真实性。这个将介绍应用程序升级器的以下几个方面&#…

第八十六期:“程序员锁死服务器导致公司倒闭”案正式开庭审理

11 月 1 日&#xff0c;据微博网友爆料&#xff0c;此前程序员锁死服务器致创业游戏公司倒闭一案已经开庭审理&#xff0c;公司创始人“螃了个蟹” 提交了对方莫名失联&#xff0c;跑路的证据。 作者&#xff1a;51CTO 11 月 1 日&#xff0c;据微博网友爆料&#xff0c;此前…

spring mvc学习(9):路径参数

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

扩展String类

因为.Net Framework中的String类是封闭的&#xff0c;所以我们不能从它进行派生来扩展它的功能。 虽然String类已经提供了很多有用的方法来让我们进行字符串的处理和操作&#xff0c;但是有时候一些特殊的的要求还是不能能到满足。 一个例子就是&#xff1a;假如有一个因为句…

第八十七期:爬了知乎“沙雕问题”,笑死个人!

这两天偶然上网的时候&#xff0c;被知乎上一个名为“玉皇大帝住在平流层还是对流层”的问题吸引。 作者&#xff1a;数据森麟 这两天偶然上网的时候&#xff0c;被知乎上一个名为“玉皇大帝住在平流层还是对流层”的问题吸引。 图片来自 Pexels 本以为只是小打小闹&#xf…

django的url控制系统

无命名分组 &#xff08;\d{4}&#xff09; 有命名分组 &#xff08;&#xff1f;P<name>\d{4}&#xff09; 一个视图做两件事&#xff0c;提交方法不一样&#xff08;if 判断&#xff09; form action"/register/" django默认添加了当前面IP和端口 url别名…

第八十八期:4000万程序员最爱开源项目和编程语言排名出炉!

今天&#xff0c;全球最大开发者社区GitHub重磅发布2019年度报告&#xff0c;透露了一个数据&#xff1a;GitHub目前在全球已有超过4000万开发者用户&#xff0c;其中80%来自美国之外的地区。 作者&#xff1a;小芹、亮亮 全球最大开发者社区GitHub今天重磅发布2019年度报告&…

Java2实用教程(第二版)程序代码——第十四章 Component类的常用方法

1//例子12import java.applet.*;import java.awt.*;3import java.awt.event.*;4import javax.swing.JTextArea;5publicclassExample14_1 extends Applet implements ItemListener6{ List list ; 7 JTextArea text; 8 public void init() 9 { listnew List(6,false…

第八十九期:还在手动盖楼领喵币?双十一这群开发者竟然如此「作弊」

开发者构建了一个脚本以自动逛双十一会场&#xff0c;让使用者轻松完成各种领币任务&#xff0c;同时还能解放双手。 作者&#xff1a;Synced 每年的 11 月份&#xff0c;总觉得有些硝烟弥漫。好在淘宝双十一领喵币&#xff0c;也已经有了自动化脚本。 感觉还未从去年双十一…

Serverless简介

说起当前最火的技术&#xff0c;除了最新的区块链&#xff0c;AI&#xff0c;还有一个不得不提的概念是Serverless。Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展&#xff0c;从AWS Lambda到阿里云函数计算&#xff0c;Serverless一路高歌&#xff0c;同时…

第九十期:哪种人是软件设计中的稀缺型人才?

好的系统架构离不开好的接口设计&#xff0c;因此&#xff0c;真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。 作者&#xff1a;从码农到工匠 好的系统架构离不开好的接口设计&#xff0c;因此&#xff0c;真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。 为什…