小黑算法成长日记10:电路布线问题中的最大不相交集合求解

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值