zoukankan      html  css  js  c++  java
  • 每日编程系列——跳石板

    一、题目:

    小易来到了一条石板路前,每块石板上从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,否则返回当前值,表示从指定起点到当前点的最小跳跃次数。
    算法如下:

     

      
  • 相关阅读:
    mysql小白系列_04 datablock
    mysql小白系列_04 binlog(未完)
    mysql小白系列_03 体系结构-线程池
    mysql小白系列_02 mysql源码安装标准化
    国庆小长假来点不一样的,如何用Python爬取了全国近5000家旅游景点,一起来看
    python爬取p站排行榜并自动发送邮件-这个项目赚了500
    利用Azure backup备份和恢复Azure虚拟机(1)
    定制化Azure站点Java运行环境(5)
    定制化Azure站点Java运行环境(4)
    定制化Azure站点Java运行环境(3)
  • 原文地址:https://www.cnblogs.com/coderls/p/6430438.html
Copyright © 2011-2022 走看看