每日编程系列——跳石板
2017-02-22 18:43
267 查看
一、题目:
小易来到了一条石板路前,每块石板上从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号石板
[b]输入描述:[/b]
[b]输出描述:[/b]
[b]输入例子:[/b]
[b]输出例子:[/b]
小易来到了一条石板路前,每块石板上从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号石板
[b]输入描述:[/b]
输入为一行,有两个整数N,M,以空格隔开。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)
[b]输出描述:[/b]
输出小易最少需要跳跃的步数,如果不能到达输出-1
[b]输入例子:[/b]
4 24
[b]输出例子:[/b]
5 二、答案解析: 此题显然是一道动态规划的题目,动态规划就是将问题划分为若干个子问题,而若干个子问题间又拥有公共的子问题,并非独立存在,问题的核心是状态转移公式,就是说下一个问题的解决,依赖着上一个问题的解,因此就此需要创建一个链表,将每个子问题的解存入,最后组合出最优解(最大或最小解),接下来详细描述一下问题的解决过程: 1.首先创建一个长度为M-N+1的整数数组,包括了起点与终点; 2.数组的元素表示从起点到达该点的最小跳跃次数,先将起点初始化为0,然后将其他元素初始化为int的最大值(一个常数),用来表示不可达; 3.接下来要遍历每一块石板(即整个数组): (1)首先要判断当前元素的值是否是int的最大值,如果是,则表示不可达,跳出当前循环,否则求解当前石板编号的因数列表,因为题目要求一次跳跃的步数只能是当前石板编号的因数; (2)然后就是遍历当前石板编号的因数列表,求出当前石板到达每一个因数对应的下一个石板的最小跳跃次数(在求解之前要判断下一个石板的编号是否小于等于M,不满足条件则跳过当前循环),求最小跳跃次数时,要在对应下一个石板元素的值和当前石板元素的值+1中取最小值 4.最后完成遍历,判断一下数组尾元素的值是否为int的最大值,如果是表示不可达,返回-1,否则返回当前值,表示从指定起点到当前点的最小跳跃次数。 算法如下:
相关文章推荐
- 每日编程系列——暗黑的字符串
- 每日编程系列———最大奇约数
- 每日编程系列——回文序列
- 每日编程系列———买苹果
- 每日编程系列——数字翻转
- 每日编程系列——洗牌
- 每日编程系列——硬币找零
- 每日编程系列——优雅的点
- 每日编程系列———计算糖果
- 利用 Microsoft .NET Framework 和托管 DirectX .0 进行游戏编程的入门系列文章
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【三】
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【一】
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【五】(上)
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【五】(下)
- C#.net word 受控编程系列1-向word中插入图片
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【五】(中)
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【二】
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【四】
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【五】(上)
- 3D 游戏编程大师技巧系列 读书笔记(-)