题解 | #跳石板#C++解法 动态规划

跳石板

https://www.nowcoder.com/practice/4284c8f466814870bae7799a07d49ec8

#include <climits>
#include <iostream>
#include <vector>
using namespace std;

//求约数
void get_y(vector<int>& v, int x) {
    for(int i = 2; i * i <= x; i++) {
        if(x % i == 0) {
            v.push_back(i);
            if(x / i != i)
            v.push_back(x / i);
        }
    }
}

int jump(int n, int m) {
    vector<int> step(m + 1, INT_MAX);
    step[n] = 0;//初始化第一个位置
    for(int i = n; i < m; i++) {
        if(step[i] == INT_MAX) continue;
        vector<int> v;//存约数
        get_y(v, i);
        for(int j = 0; j < v.size(); j++) {
            //如果不是第一次到这里
            if(i + v[j] <= m && step[i + v[j]] != INT_MAX) {
                //新的和旧的比较谁的步数少
                step[i + v[j]] = step[i + v[j]] > step[i] + 1 ? step[i] + 1 : step[i + v[j]];
            }
            else if(i + v[j] <= m) {
                //如果是第一次来就直接赋值
                step[i + v[j]] = step[i] + 1;
            }
        }
    }
    //如果该位置被赋值,证明找到了,返回该位置的值即可
    return step[m] == INT_MAX ? -1 :step[m];
}

int main() {
    int n, m, min_step;
    cin >> n >> m;
    min_step = jump(n, m);
    cout << min_step << endl;
    return 0;
}

全部评论

相关推荐

认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务