当前位置:   article > 正文

2021年第十二届蓝桥杯省赛Python组(真题+解析+代码):路径_第12届蓝桥杯stema真题 python

第12届蓝桥杯stema真题 python

1 真题


2 解析

难度系数:⭐⭐

考察题型:数论  动态规划 

涉及知识点:最小公倍数 最短路径 

思路分析:

这道题可谓是究极嵌套!融合了最短路径,最小公倍数和动态规划。一个不会就全凉了~

最小公倍数我已经整理成精简模板放代码里了,考试时直接套模板就行。

动态规划经典的做题步骤有5步。

 第一步:明白dp[i]的含义

 dp[i] #i:结点编号1~2021 #dp[i]:当前结点到结点1的最短路径长度

第二步:给dp数组初始化赋值

  1. dp=[float('inf')]*(n+1) #创建列表赋值为无穷大
  2. dp[1]=0 #结点1的长度初始化为0

第三步:弄清dp[i]遍历的顺序

  1. for i in range(1,n+1): #先遍历结点a:遍历结点1~n
  2. for j in range(i+1,i+22): #再遍历结点b:遍历结点i+1~i+21

第四步:搞懂递推公式

dp[j]=min(dp[j],dp[i]+lcm(i,j))  #递推公式

第五步:打印数组

print(dp[n])                    #输出结果:10266837

参考资料:

python的动态规划我是看这个视频学的,学会里面的经典案例,动态规划一通百通~

清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili


3 代码

  1. #最小公倍数模板(least common multiple)
  2. def lcm(a,b):
  3. if a<b:
  4. a,b=b,a
  5. c,d=a,b
  6. while d!=0:
  7. c,d=d,c%d
  8. return (a*b)//c
  9. #最短路径(dp)
  10. n=2021 #结点数量
  11. dp=[float('inf')]*(n+1) #创建列表赋值为无穷大
  12. dp[1]=0 #结点1的长度初始化为0
  13. for i in range(1,n+1): #结点a:遍历结点1~n
  14. for j in range(i+1,i+22): #结点b:遍历结点i+1~i+21
  15. if j>n: #j超出结点范围时
  16. break #结束循环
  17. dp[j]=min(dp[j],dp[i]+lcm(i,j))#递推公式
  18. print(dp[n]) #输出结果:10266837

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/63960?site
推荐阅读
相关标签