import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
//定义步数,最多能走m+1步
int[] step = new int[m+1];
for(int i = 0;i < m+1;i++){
//初始化step[i]为最大值
step[i] = Integer.MAX_VALUE;
}
//从n石板起跳,默认步数为0
step[n] = 0;
for(int i = n;i < m;i++){
//跳不到最后一个石板
if(step[i] == Integer.MAX_VALUE){
continue;
}
//求i的约数
List<Integer> list = div(i);
for(int j:list){
if(i+j <= m && step[i+j] != Integer.MAX_VALUE){
step[i+j] = Math.min(step[i+j],step[i]+1);
}else if(i+j <= m){
step[i+j] = step[i]+1;
}
}
}
if(step[m] == Integer.MAX_VALUE){
System.out.println(-1);
}else{
System.out.println(step[m]);
}
}
public static List<Integer> div(int num){
//定义一个链表
List<Integer> list = new ArrayList<>();
//题目中要求约数除去1和它本身,所以要从2开始
for(int i = 2;i*i <= num;i++){
if(num%i == 0){
list.add(i);
if(num/i != i){
list.add(num/i);
}
}
}
return list;
}
}
【动态规划】跳石板
最新推荐文章于 2023-04-05 12:24:37 发布
该博客主要介绍了一个关于跳石板的问题,通过输入石板数量n和最大步长m,寻找从n石板跳跃到m石板所需的最小步数。作者使用动态规划的方法,初始化一个步数数组,并通过遍历所有可能的跳跃组合来更新步数。博客还包含了一个辅助方法用于获取一个数的约数。最后,如果能够到达m石板,输出最小步数,否则输出-1。
摘要由CSDN通过智能技术生成