当前位置:   article > 正文

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

蓝桥杯2021python省赛题解

1 真题

 


 2 解析

难度系数:⭐⭐⭐

考察题型:动态规划 数论

涉及知识点:状压DP 互质

思路分析:

>> 和 <<都是位运算,对二进制数进行移位操作。
<< 是左移,末位补0,类比十进制数在末尾添0相当于原数乘以10,x<<1是将x的二进制表示左移一位,相当于原数x乘2。比如整数4在二进制下是100,4<<1左移1位变成1000(二进制),结果是8。
>>是右移,右移1位相当于除以2。

具体思路参考:

2021年第十二届蓝桥杯软件类省赛python组“回路计算“问题_qq_60300168的博客-CSDN博客


3 代码

  1. from math import gcd
  2. n = 21
  3. m = 1 << n
  4. dp = [[0 for j in range(n)] for i in range(m)] #dp[i][j]对于状态i,i的二进制表示中为1的位置 表示走过了教学楼j
  5. load = [[False for j in range(n)] for i in range(n)] #存储i, j之间是否有路
  6. for i in range(1, n + 1):
  7. for j in range(1, n + 1):
  8. if gcd(i, j) == 1:
  9. load[i - 1][j - 1] = True
  10. dp[1][0] = 1
  11. for i in range(1, m): #枚举每一种状态
  12. for j in range(n):
  13. if i >> j & 1: #判断状态i是否包含第j栋教学楼
  14. for k in range(n): #枚举所有可能从教学楼k走到教学楼j的情况
  15. if i - (1 << j) >> k & 1 and load[k][j]: #判断状态i除去j后是否包含k
  16. dp[i][j] += dp[i - (1 << j)][k]
  17. print(sum(dp[m - 1]) - dp[m - 1][0]) #输出结果:881012367360

   

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