一、问题描述
\quad \quad 在一块电路板的上、下两端分别有 n n n 个接线柱。根据电路设计,要求用导线 ( i , π ( i ) ) (i,π(i)) (i,π(i)) 将上端接线柱 i i i 与下端接线柱 π ( i ) π(i) π(i) 相连。如下图所示,其中, π ( i ) , 1 ≤ i ≤ n π(i),1≤ i ≤n π(i),1≤i≤n, 是{1,2,…,n}的一个排列。导线 ( I , π ( i ) ) (I, π(i)) (I,π(i)) 称为该电路板上的第 i i i 条连线。对于任何 1 ≤ i ≤ j ≤ n 1 ≤ i ≤ j ≤n 1≤i≤j≤n, 第i条连线和第j条连线相交的充要条件是 π ( i ) > π ( j ) π(i)> π(j) π(i)>π(j).
π ( i ) = { 8 , 7 , 4 , 2 , 5 , 1 , 9 , 3 , 10 , 6 } π(i)={8,7,4,2,5,1,9,3,10,6} π(i)={8,7,4,2,5,1,9,3,10,6} \quad \quad 在制作电路板时,要求将这 n n n 条连线分布到若干绝缘层上。在同一层上的连线不相交。电路布线问题要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。换句话说,该问题要求确定导线集 N e t s = { ( i , π ( i ) ) , 1 ≤ i ≤ n } Nets = {(i,π(i)),1 ≤ i ≤ n \} Nets={(i,π(i)),1≤i≤n} 的最大不相交子集。
1)同一层电路布线可以如下
2)同一层电路布线不可能如下
二、最优子结构性质
\quad \quad 记 N ( i , j ) = { t ∣ ( t , π ( t ) ) ∈ N e t s , t ≤ i , π ( t ) ≤ j } N(i,j) = \{t|(t,π(t))∈Nets,t \leq i,π(t) \leq j\} N(i,j)={t∣(t,π(t))∈Nets,t≤i,π(t)≤j}。 N ( i , j ) N(i,j) N(i,j)的最大不相交子集为 M N S ( i , j ) MNS(i,j) MNS(i,j)。 S i z e ( i , j ) = ∣ M N S ( i , j ) ∣ Size(i,j) = | MNS(i,j)| Size(i,j)=∣MNS(i,j)∣。
(1) 当 i = 1 i = 1 i=1,
M N S ( 1 , j ) = N ( 1 , j ) = { 0 , j < π ( 1 ) 1 , j ≥ π ( 1 ) MNS(1,j)=N(1,j) = \begin{cases} 0 ,j < π(1) \\ 1 ,j \geq π(1) \end{cases} MNS(1,j)=N(1,j)={0,j<π(1)1,j≥π(1)
(2) 当 i > 1 i > 1 i>1时,
1) j < π ( i ) j < π(i) j<π(i) 时, ( i , π ( i ) ) ∉ N ( i , j ) (i, π(i)) \notin N(i,j) (i,π(i))∈/N(i,j),在这种情况下, N ( i , j ) = N ( i − 1 , j ) N(i,j) = N(i-1,j) N(i,j)=N(i−1,j), 从而 S i z e ( i , j ) = S i z e ( i − 1 , j ) Size(i,j) = Size(i-1,j) Size(i,j)=Size(i−1,j)。
2) j ≥ π ( i ) j \geq π(i) j≥π(i),此时,若 ( i , π ( i ) ) ∈ N ( i , j ) (i, π(i)) \in N(i,j) (i,π(i))∈N(i,j),则对于任意的 ( t , π ( t ) ) ∈ M N S ( i , j ) (t, π(t)) \in MNS(i,j) (t,π(t))∈MNS(i,j),有 t < i t<i t<i 且 π ( t ) < π ( i ) π(t)<π(i) π(t)<π(i),否则, ( i , π ( i ) ) (i, π(i)) (i,π(i)) 与 ( t , π ( t ) ) (t, π(t)) (t,π(t)) 相交。在这种情况下 M N S ( i , j ) − { ( i , π ( i ) ) } MNS(i,j)-\{(i,π(i)) \} MNS(i,j)−{(i,π(i))} 是 N ( i − 1 , π ( i ) − 1 ) N(i-1,π(i)-1) N(i−1,π(i)−1) 的最大不相交子集。
三、递归计数最优值
电路布线的最优值 S i z e ( n , n ) Size(n,n) Size(n,n),由该问题的最优子结构性质可知:
(1) 当 i = 1 i = 1 i=1,
S i z e ( 1 , j ) = { 0 , j < π ( 1 ) 1 , j ≥ π ( 1 ) Size(1,j) = \begin{cases} 0 ,j < π(1) \\ 1 ,j \geq π(1) \end{cases} Size(1,j)={0,j<π(1)1,j≥π(1)
(2) 当 i > 1 i > 1 i>1 时,
S i z e ( i , j ) = { S i z e ( i − 1 , j ) , j < π ( i ) m a x { S i z e ( i − 1 , j ) , S i z e ( i − 1 , π ( i ) ) + 1 } , j ≥ π ( i ) Size(i,j)=\begin{cases} Size(i-1,j),j < π(i) \\ max\{ Size(i-1,j) , Size(i-1,π(i))+1\},j \geq π(i) \end{cases} Size(i,j)={Size(i−1,j),j<π(i)max{Size(i−1,j),Size(i−1,π(i))+1},j≥π(i)
四、自顶向下计算最优值
在斜角值改变时可以取得所求的子集。即(9,10),(7,9),(5,5)(3,4)