所用到的知识
STL中的vector容器
动态规划思想
算法中的min
编程思想
- 将1 - M个看成一排,为其取个名字叫Slab(数组),并在走之前将这一排石板都初始化为0,然后开始走,每到一块是班上就在这块是石板上写下到这里来的步数,如果脚下踩的这块石板上写的0,说明之前没有来过,那就不可能走到这里,跳过这个石板,重新走
2. 从起点开始对这一排石板Slab进行遍历,求出可以从这块石板出发走的步数(当前石板对应位置的所有约数) - 到达当前位置就要更新这块石板的上面写的步数,选择之前走的步数和现在走的步数中最小的卸载当前是石板上,如果之前没有到达过这块石板则更新为此时位置的最小步数 + 1,
4. 知道走到最后一块石版,或者下一次将要走到最后一块石板的时候,看之前有没有到过最后一块石板,如果有,就返回上面的步数(Slab[m]),如果没有就要返回-1
接下来就直接上代码,代码中也有注释
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//计算该数的公约数
void Divisor(int n,vector<int>& buff)
{
for(size_t i = 2; i <= sqrt(n); ++