虽然题目说了是图,可以很容易想到用dijkstra和floyd算法求解,但是思考一下可以发现这题用dp的解法更方便。
状态转移方程为
path_length[j] = min(path_length[j],path_length[i]+i*j/gcd(i,j))
其中i表示当前出发的节点,j为当前到达的节点,如果这条路径比原来存储的到达j节点的长度短,则更新路径长度。
#include <iostream>
#include <algorithm>
using namespace std;
long long path[3000];
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main(){
for(int i=1;i<=2021;i++) path[i]=10000000000000;
path[1]=0;
for(int i=1;i<=2021;i++){
for(int j=i+1;j<=i+21;j++){
path[j] = min(path[j],path[i]+((i*j)/gcd(i,j)));
}
}
cout<<path[2021];
system("pause");
}