可以先求出所有路径
然后dp求出最短路径
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
return a%b==0?b:gcd(b,a%b);
}
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
int l[2050][2050], opt[2050];//l为节点间路径长度
int main()
{
memset(opt, 0x3f3f3f, sizeof(opt));//求最短路径全部初始化为0x3f3f3f;
for (int i = 1; i <= 2021; i++) //求出所有节点的长度
{
for (int j = i + 1; j <= i + 21; j++)
l[i][j] = l[j][i] = lcm(i, j);
}
opt[1] = 0;
for (int i = 2; i <= 2021; i++) {
for (int j = i - 1; j >= i - 21 && j > 0; j--) {
opt[i] = min(opt[i], opt[j] + l[i][j]);
}
}
cout << opt[2021] << endl;
return 0;
}