赞
踩
难度系数:⭐⭐⭐
考察题型:动态规划 数论
涉及知识点:状压DP 互质
思路分析:
>> 和 <<都是位运算,对二进制数进行移位操作。 << 是左移,末位补0,类比十进制数在末尾添0相当于原数乘以10,x<<1是将x的二进制表示左移一位,相当于原数x乘2。比如整数4在二进制下是100,4<<1左移1位变成1000(二进制),结果是8。 >>是右移,右移1位相当于除以2。
具体思路参考:
2021年第十二届蓝桥杯软件类省赛python组“回路计算“问题_qq_60300168的博客-CSDN博客
- from math import gcd
- 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 j in range(n)] for i in range(n)] #存储i, j之间是否有路
- for i in range(1, n + 1):
- for j in range(1, n + 1):
- if gcd(i, j) == 1:
- load[i - 1][j - 1] = True
- dp[1][0] = 1
- for i in range(1, m): #枚举每一种状态
- for j in range(n):
- if i >> j & 1: #判断状态i是否包含第j栋教学楼
- for k in range(n): #枚举所有可能从教学楼k走到教学楼j的情况
- if i - (1 << j) >> k & 1 and load[k][j]: #判断状态i除去j后是否包含k
- dp[i][j] += dp[i - (1 << j)][k]
- print(sum(dp[m - 1]) - dp[m - 1][0]) #输出结果:881012367360
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。