0
点赞
收藏
分享

微信扫一扫

【每日一题】备战冲击蓝桥杯国赛——Python程序设计 | Day15 | 回路计数 | 真题代码解析


每天刷一道题,话不多说,先刷近两年的题吧,现在是2021年的真题了,如果有一起的可以加入我们!!!

一起来刷题,冲击国赛!!!


扫码 我的主页 网页左边下方 群二维码

加入方式:可以在下方的微信名片加我,然后拉你入群。(记得备注暗号我要拿国奖


2021年第十二届蓝桥杯赛题总览

2020年的题就是这些,类型分为两种,分别是结果填空和程序设计,我们每天刷一道题,省赛没问题!
在这里插入图片描述

回路计数 (题目)

(本题总分:15分)

官方练习系统:https://www.lanqiao.cn/problems/1462/learning/


—>【问题描述】

在这里插入图片描述

—>【结果描述】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


解析


通过阅读题干,本题——难度中等:⭐⭐⭐

考察类型:动态规划、数论

考察知识点:互质、dp


分析:


代码

Python代码实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/3/9 15:22
# @Author  : 府学路18号车神
# @Email   :yurz_control@163.com
# @File    : Day15.py

from math import gcd    # 导入函数求解最大公约数
from time import time

n = 21       # 输入栋数
m = 1 << n
dp = [[0 for j in range(n)] for i in range(m)]      # #dp[i][j]对于状态i,i的二进制表示中为1的位置 表示走过了教学楼j
load = [[False for a in range(n)] for b in range(n)]

start_time = time()
for a in range(1, n+1):
    for b in range(1, n+1):
        if gcd(a, b) == 1:  # 如果a和b之间的最大公约数为1,则表示互质
            load[a-1][b-1] = True
dp[1][0] = 1            # 从第一栋楼出发
for a in range(1, m):
    for b in range(1, m):
        if a >> b & 1:          # 判断状态i是否包含第j栋教学楼
            for k in range(n):          # 枚举所有可能从教学楼k走到教学楼j的情况
                if a - (a<<b) >> k & a and load[k][b]:
                    dp[a][b] += dp[a-(1<<b)][k]
end_time = time()
print("总共耗时:", end_time-start_time)		
print(sum(dp[m-1]) - dp[m-1][0])            # 计算时间很长, 结果为:881012367360

在这里插入图片描述

可以得出最终的结果为:881012367360

由此,我们可以快速得出结果,验证完毕!


今天开刷第 十五 天,欢迎大家加入,一起变强,一起自律,一起上国赛!!!

有不同解法的可以在下面留言哦!~

往期刷题路线:

刷题路线Detail
2020年
Day-01门牌制作
Day-02寻找2020
Day-03跑步锻炼
Day-04蛇形填数
Day-05排序
Day-06装饰珠
Day-07成绩统计
Day-08单词分析
Day-09数字三角形
Day-10平面切分
2021年
Day-11卡片
Day-12直线
Day-13货物摆放
Day-14路径

官方刷题练习系统:http://lx.lanqiao.cn/


ღ( ´・ᴗ・` )

举报

相关推荐

0 条评论