思路分析:
这道题可谓是究极嵌套!融合了最短路径,最小公倍数和动态规划。一个不会就全凉了~
最小公倍数我已经整理成精简模板放代码里了,考试时直接套模板就行。
动态规划经典的做题步骤有5步。
#最小公倍数模板(least common multiple)
#关键是求出a,b两个数的最大公约数c
def lcm(a,b):
if a<b:
a,b=b,a
c,d=a,b
while d!=0:
c,d=d,c%d
return (a*b)//c
#最短路径(dp)
n=2021 #结点数量
dp=[float('inf')]*(n+1) #创建列表赋值为无穷大
dp[1]=0 #结点1的长度初始化为0
for i in range(1,n+1): #结点a:遍历结点1~n
for j in range(i+1,i+22): #结点b:遍历结点i+1~i+21
if j>n: #j超出结点范围时
break #结束循环
dp[j]=min(dp[j],dp[i]+lcm(i,j))#递推公式
print(dp[n]) #输出结果:10266837