每日编程系列——跳石板

一、题目:

小易来到了一条石板路前,每块石板上从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