問題描述:
在一塊電路板的上、下兩端分別有n個接線柱。根據電路設計,要求用導線(i,π(i)) 將上端接線柱i與下端接線柱π(i)相連,如下圖。其中,π(i),1≤ i ≤n,是{1,2,…,n}的乙個排列。導線(i, π(i))稱為該電路板上的第i條連線。對於任何1 ≤ i ≤ j ≤n,第i條連線和第j條連線相交的充要條件是π(i)> π(j).
在製作電路板時,要求將這n條連線分布到若干絕緣層上。在同一層上的連線不相交。電路佈線問題要確定將哪些連線安排在第一層上,使得該層上有盡可能多的連線。換句話說,該問題要求確定導線集nets = {i,π(i),1 ≤ i ≤ n}的最大的乙個子集,這個子集中的導線互相不相交。
問題分析:
顯然這是乙個組合問題,對於組合問題中求最優解的方法基本都是動態規劃演算法。現在表述一下如何劃分子問題:
用b(i,j)表示最優解,其中,i是上端接線柱的序號,j是下端接線柱的序號,b(i,j)表示序號小於或等於i的上端接線柱和序號小於或等於j的下端接線柱中不相交連線的最大集合。 用size(i,j)表示集合中導線的數目(size(i,j)=|b(i,j)|)。b(i,j)的值蘊含在b(i-1,j)和b(i,j-1)這倆個子問題中,對於有2xn個接線柱的電路板,那麼b(n,n)就是其解了。
對於上端接線柱t,用 π(t)表示與他相連的下端接線柱
那麼遞推公式為:
b(i-1,j-1)u,( j==π(i))
b(i,j)=
size(i-1,j)>size(i,j-1)?b(i-1,j):b(i,j-1) ,(j!== π(i))
size(i-1,j-1)+1, (j==π(i))
size(i,j)=
max(size(i-1,j),size(i,j-1)), (j!== π(i))
遞推公式證明:
對於從b(i-1,j)或b(i,j-1)到b(i,j)要麼會多加一條導線,要麼不加。
1. 當 j==π(i)時,(i,j)則是一條導線,且這條導線對b(i-1,j-1)的值沒有影響,因為b(i-1,j-1)中的任意的一條導線的節點序號(無論是上端節點序號還是下端節點序號)都小於i,j,這由其空間位置決定的。
現在求b(i,j), 即求序號小於或等於i的上端接線柱和序號小於或等於j的下端接線柱中不相交導線的最大集合。顯然應是b(i-1,j-1)u(i,j).
2 . 當j!= π(i)時。假如問題是從b(i,j-1)到b(i,j),那麼下端新加入的接線柱j要麼與上端的1至i-1個接線柱構成導線(與第i個接線柱構成導線的情況在上面已經討論),要麼不構成。
如果構成的話那麼這種情況其實已經在b(i-1,j)中討論了,這裡不再考慮。那麼b(i,j) 應是序號區間比他小一點的子問題的解。小一點是多少,肯定就是少乙個接線柱了,也就是b(i-1,j)。
如果不構成的話,那麼b(i,j)肯定就是序號區間比他小一點的子問題的解了。
對於b(i,j)可能由b(i-1,j)或b(i,j-1)過渡而來,所以b(i,j)取其中較大的乙個。
1intmain()
2;//
按序存放下端對應接線柱序號
4int matrix[n+1][n+1][2]=;
5for(int i=1;i1;i++)
6else
1418}19
}20 cout<
the result is :
"<0]/
輸出的是最大導線集中導線的數目,有儲存中間決策結果
21return0;
22 }
動態規劃電路佈線
電路佈線簡介 舉例及其詳細說明 塊測試結果 在一塊電路板的上下兩端分別有n個接線柱。根據電路設計,要求用導線 i,i 將上端接線柱i與下端接線柱 i 相連,如圖,其中,i 1 i n,是 1,2 n 的乙個排列.導線 i,i 稱為該電路板上的第i條連線.對於任何1 i小於j n,第i條連線和第j條連...
動態規劃 電路佈線
1 問題描述 在一塊電路板的上 下兩端分別有n個接線柱。根據電路設計,要求用導線 i,i 將上端接線柱i與下端接線柱 i 相連,如下圖。其中,i 1 i n,是 1,2,n 的乙個排列。導線 i,i 稱為該電路板上的第i條連線。對於任何1 i j n,第i條連線和第j條連線相交的充要條件是 i j ...
動態規劃 電路佈線問題
1 問題描述 在一塊電路板的上 下兩端分別有n個接線柱。根據電路設計,要求用導線 i,i 將上端接線柱i與下端接線柱 i 相連,如下圖。其中,i 1 i n,是 1,2,n 的乙個排列。導線 i,i 稱為該電路板上的第i條連線。對於任何1 i j n,第i條連線和第j條連線相交的充要條件是 i j ...