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

1 真题


2 解析

难度系数:⭐⭐

考察题型:数论  动态规划 

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

思路分析:

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

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

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

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

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

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

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

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

for i in range(1,n+1):          #先遍历结点a:遍历结点1~n
    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 代码

#最小公倍数模板(least common multiple)
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


  📍我写的是关于蓝桥杯的系列题解,感谢关注我的朋友们,我会持续输出高质量文章💪🏻              
蓝桥杯python组十二届省赛真题+解析+代码(通俗易懂版)_编程有了思路-CSDN博客_蓝桥杯大赛python小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1拼到多少?https://blog.csdn.net/m0_55148406/article/details/122774029

  • 26
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蓝刷题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值