【蓝桥杯】真题 路径(数论+dp)
思路
求最小公倍数LCM问题很好求,这里看似是求图最短路径,实际上由于只有[i,i+21]
之间存在路径,所以用线性dp
效率更高,当然用bfs,dijstra,floyed也可,毕竟是填空题。
code
def gcd(a,b):
if a < b:
a,b = b,a
if b != 0:
return gcd(b,a%b)
if b == 0:
return a
def lcm(a,b):
return a*b//gcd(a,b)
dp = [float('inf') for i in range(2022)]
dp[1] = 0
for i in range(1,2022):
for j in range(1,22):
if i+j > 2021:break
dp[i+j] = min(dp[i+j], dp[i]+lcm(i,i+j))
print(dp[2021])