c = [8,7,4,2,5,1,9,3,10,6]
print('对应位置电路连线:')
for i,t in enumerate(c):
print(i+1,'----->',t)
def MNS(c): # 动态规划求解最大不相交自己个数
n = len(c)
C = c[:] # 数组的复制
C.insert(0,0) # 使编号从1开始
size = [[0] * (n+1) for i in range(n+1)] # 创建动态规划数组
for j in range(C[1]): # 初始化矩阵,pi(1)之前位置赋值为0,pi(1)之后位置赋值为1
size[1][j] = 0
for j in range(C[1],n+1):
size[1][j] = 1
for i in range(2,n+1): # 从第二根线开始进行动态规划
for j in range(1,C[i]): # j在pi(i)之前的时候,(i,pi(i))这条连线对最大不相交集合没有贡献
size[i][j] = size[i-1][j]
for j in range(C[i],n+1): # 在pi(i)之后的时候,判断此条线(i,pi(i))对最大不相交集合是否有贡献
size[i][j] = max(size[i-1][j],size[i-1][C[i]-1]+1)
print('打印动态规划矩阵:')
for i in range(1,n+1):
for j in range(1,n+1):
print(size[i][j],end=' ')
print()
return size[n][n]
print('最大不相交电线子集个数为:',MNS(c))
输出:
对应位置电路连线:
1 -----> 8
2 -----> 7
3 -----> 4
4 -----> 2
5 -----> 5
6 -----> 1
7 -----> 9
8 -----> 3
9 -----> 10
10 -----> 6
打印动态规划矩阵:
0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 1 1 1 1
0 0 0 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 1 1
0 1 1 1 2 2 2 2 2 2
1 1 1 1 2 2 2 2 2 2
1 1 1 1 2 2 2 2 3 3
1 1 2 2 2 2 2 2 3 3
1 1 2 2 2 2 2 2 3 4
1 1 2 2 2 3 3 3 3 4
最大不相交电线子集个数为: 4