博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每日编程系列——跳石板
阅读量:6312 次
发布时间:2019-06-22

本文共 987 字,大约阅读时间需要 3 分钟。

一、题目:

小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......

这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板 
输入描述:
输入为一行,有两个整数N,M,以空格隔开。(4 ≤ N ≤ 100000)(N ≤ M ≤ 100000)
输出描述:
输出小易最少需要跳跃的步数,如果不能到达输出-1
输入例子:
4 24
输出例子:
5 二、答案解析: 此题显然是一道动态规划的题目,动态规划就是将问题划分为若干个子问题,而若干个子问题间又拥有公共的子问题,并非独立存在,问题的核心是状态转移公式,就是说下一个问题的解决,依赖着上一个问题的解,因此就此需要创建一个链表,将每个子问题的解存入,最后组合出最优解(最大或最小解),接下来详细描述一下问题的解决过程: 1.首先创建一个长度为M-N+1的整数数组,包括了起点与终点; 2.数组的元素表示从起点到达该点的最小跳跃次数,先将起点初始化为0,然后将其他元素初始化为int的最大值(一个常数),用来表示不可达; 3.接下来要遍历每一块石板(即整个数组):  (1)首先要判断当前元素的值是否是int的最大值,如果是,则表示不可达,跳出当前循环,否则求解当前石板编号的因数列表,因为题目要求一次跳跃的步数只能是当前石板编号的因数;  (2)然后就是遍历当前石板编号的因数列表,求出当前石板到达每一个因数对应的下一个石板的最小跳跃次数(在求解之前要判断下一个石板的编号是否小于等于M,不满足条件则跳过当前循环),求最小跳跃次数时,要在对应下一个石板元素的值和当前石板元素的值+1中取最小值 4.最后完成遍历,判断一下数组尾元素的值是否为int的最大值,如果是表示不可达,返回-1,否则返回当前值,表示从指定起点到当前点的最小跳跃次数。 算法如下:

 

  

转载于:https://www.cnblogs.com/coderls/p/6430438.html

你可能感兴趣的文章
(算法)交错的字符串
查看>>
hdu 5471(状压DP or 容斥)
查看>>
oracle.jdbc.driver.OracleDriver和oracle.jdbc.OracleDriver这两个驱动的区别
查看>>
NSQ部署
查看>>
git常用命令记录
查看>>
IBM发布新一代云计算工具包MobileFirst Foundation
查看>>
唯品会HDFS性能挑战和优化实践
查看>>
大规模学习该如何权衡得失?解读NeurIPS 2018时间检验奖获奖论文
查看>>
大厂前端高频面试问题与答案精选
查看>>
我们用5分钟写了一个跨多端项目
查看>>
Visual Studio 15.4发布,新增多平台支持
查看>>
有赞透明多级缓存解决方案(TMC)设计思路
查看>>
如何设计高扩展的在线网页制作平台
查看>>
Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
查看>>
Swift 5将强制执行内存独占访问
查看>>
中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?
查看>>
深度揭秘腾讯云低功耗广域物联网LPWAN 技术及应用
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
More than React(四)HTML也可以静态编译?
查看>>
React Native最佳学习模版- F8 App开源了
查看>>