问题描述:在一块电路板的上、下2端分别有n个接线柱。根据电路设计,要求用导线(i,π(i))将上端接线柱与下端接线柱相连,如图所示。其中π(i)是{1,2,…,n}的一个排列。导线(i,π(i))称为该电路板上的第i条连线。对于任何1≤i<j≤n,第i条连线和第j条连线相交的充分且必要的条件是π(i)>π(j)。
电路布线问题要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。换句话说,该问题要求确定导线集Nets={(i,π(i)),1≤i≤n}的最大不相交子集。
总结一下题干:①第i条连线和第j条连线相交要满足的条件:π(i)>π(j)
②主要有这几个变量:1≤i≤n,1≤j≤n代表接线柱, π代表一种排列
主要要解决的问题:我要确定第一层怎么设计才能向上摞其他电路板,怎么摞?随便摞吗?不是的,我要考虑怎么让第一层电路板的连线最多。好,下面开始搭建数学模型:
记录
N(i,j)的最大不相交子集为MNS(i,j)。Size(i,j)=|MNS(i,j)|。(Size(i,j)代表条数)
①当i等于1时,![](https://i-blog.csdnimg.cn/blog_migrate/ca68344031ce5c72d9d2057e4a9ef7a2.png)
我详细解释一下这个公式什么意思:在i等于1这种情况下,在已经存在连线π(1)的后面都可以安排线相连,但是在π(1)之前的线无法相连。
②当i大于1时,又分成三种情况:
2.1 j<π(i)时,这个时候划线的结果是前一个接线柱划线的结果(举例:N(2,7) = N (1,7),这个时候因为大于这个对应关系的线已经不需要画上了,所以对应的情况就是N(1,7)的划线情况)
即:此时,
。故在这种情况下,N(i,j)=N(i-1,j),从而Size(i,j)=Size(i-1,j)。
2.2 j≥π(i)时,
存在选择线和不选择线两种情况,我们只需要比较两个情况的最大值进行输出就可以了
最后呢,我们可以列出递推公式:
代码的话,可以参考一下这篇博客:https://blog.csdn.net/huangxy10/article/details/7782865