小易来到了一条石板路前,每块石板上从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 示例1 输入 4 24 输出 5
二、分析
[状态][选择][状态转移方程]
状态显然就是当前所在的位置N,选择就是除1和N外的所有因子
dp数组的含义:dp[i]代表从N到i的最少移动步数,base case就是dp[N] = 0
根据N的因子来决定
;对于dp[N] 遍历N的因子(sub[i-j]) ,dp[N+sub[i-j]]即为可到达且从N一步到达,这里dp[N+sub[i-j]]和dp[N]+1取最小值即可
。所以状态转移方程:dp[i+sub[j]]=min(dp[i+sub[j]],dp[i]+1)
到这里大问题就解决了,还有很多细节问题,比如如果所有的i + sub[j]都不等于M怎么办,即无法从N走到M怎么表示,所以这里在初始化dp数组时需要一个特殊值
三、代码
//闲着没事不要跳石板了,谢谢 #include<bits/stdc++.h> using namespace std; //在求因子的时候要注意同时求除数和被除数,否则会超时 void getsub(vector<int>&sub,int num) { sub.clear(); for(int i = 2;i * i <= num;++i) { //除数 if(num % i == 0) { sub.push_back(i); //被除数 if(i != num / i) sub.push_back(num / i); } } } int main() { int N,M; cin>>N>>M; //保存因子 vector<int>sub; //初始化dp数组为INT_MAX,最后用来区分 vector<int>dp(M+1,INT_MAX); //base case dp[N]=0; //构造dp矩阵 for(int i = N;i <= M;++i) { //代表这条路行不通,没有到达i的方案,判断下一个N if(dp[i] == INT_MAX) continue; //获取因子 getsub(sub,i); for(int j = 0;j < sub.size();++j) { if(i + sub[j] <= M) //跳到的下一个位置肯定是当前位置+因子, //那么dp[下一个位置] = dp[当前位置 + 因子] = dp[当前位置] + 1 //因为可能不只一次到达,所以求min dp[i + sub[j]] = min(dp[i + sub[j]],dp[i] + 1); } } //初始化的作用 if(dp[M] == INT_MAX) cout<<-1<<endl; else cout<<dp[M]; return 0; }
#include <iostream> #include <vector> #include <climits> #include <cmath> #include <algorithm> using namespace std; int main() { int N,M; while(cin>>N>>M) { vector<int> steps(M + 1,INT_MAX); steps[N] = 0; for(int i = N;i <= M;i++) { if(steps[i] == INT_MAX) { continue; } for(int j = 2;(j * j) <= i;j++) { if(i % j == 0) { if(i + j <= M) { steps[i + j] = min(steps[i] + 1,steps[i + j]); } if(i + (i / j) <= M) { steps[i + (i / j)] = min(steps[i] + 1,steps[i + (i / j)]); } } } } if(steps[M] == INT_MAX){ steps[M] = -1; } cout<<steps[M]<<endl; } return 0; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算