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…

找了好久的BUG

找了好久的BUG <rsp:WEBPAGE id"PageContainer" TabSectionID"*****" runat"server"></rsp:WEBPAGE> <rsp:PLACEHOLDER id"AdminPage_Title" runat"server">公文流转流程工作点定义</rsp:PLACEHOLDER&…

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;总体情节比较浪漫曲折(虽然部…

【BZOJ4559】【JLOI2016】—成绩比较(拉格朗日插值+dp)

传送门 dpdpdpf[i][j]f[i][j]f[i][j]表示前iii门课&#xff0c;有jjj个人没有被碾压的方案数 考虑f[i−1][j]f[i-1][j]f[i−1][j]转移到f[i][w](j≤w)f[i][w](j\le w)f[i][w](j≤w) 首先要选出w−jw-jw−j个新的没被他碾压的人 由于之前已经有一些没被碾压的人,所以方案数为(n−…

中兴通讯 基于定位的技术和市场分析

中兴通讯 基于定位的技术和市场分析 (2004-08-10 09:04:27) 8月5日&#xff0c;由中国联通和中兴通讯联合举办的“中国联通位置业务研讨会”在海口举行。中国联通总部及多个省的分公司领导&#xff0c;应用中兴通讯PN4747定位系统开展定位业务的多家集团客户代表以及华好…

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

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

15. 3Sum-数组

文章目录1题目理解2 排序双指针1题目理解 输入&#xff1a;int数组nums 规则&#xff1a;查找数组中任意三个数的和等于0 输出&#xff1a;符合条件的解&#xff0c;不包含重复的解 例子&#xff1a; nums [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1…

第八十四期: 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…

141. Linked List Cycle

文章目录1 题目理解2 分析13 分析21 题目理解 输入&#xff1a;一个单向链表。 输出&#xff1a;如果链表中有环&#xff0c;输出true。否则输出false。 规则&#xff1a;单向链表只能向前移动。 2 分析1 可以把节点放入map中&#xff0c;不断遍历。如果碰到已经遍历的节点&…

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;此前…

delphi 参数化sql

曾经查过资料&#xff0c;后来忘了&#xff0c;现在做一下记录。 --------- 在 sql 语句里占位使用 一个冒号和一个用来表示这个位置的符号, 例如&#xff1a;SELECT * FROM aTableName WHERE aCol :ColVal SELECT * FROM aTableName WHERE aCol :ColVal 对占位了的地方赋值…

20 Valid Parentheses

1 题目理解 输入&#xff1a;一个字符串s&#xff0c;只包含( ) { } [ ]这六种字符。 输出&#xff1a;字符串是否有效 规则&#xff1a;一个有效的字符串需要括号对应匹配&#xff0c;并且要左括号在前。 举例&#xff1a; 1 输入s"()"&#xff0c;输出true 2 Inpu…

SQL select 语法(转)

SQL 里面最常用的命令是 SELECT 语句&#xff0c;用于检索数据。语法是&#xff1a; SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]* | expression [ AS output_name ] [, ...][ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ][ FROM from_item [, ...] ][ WHER…

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…