動態規劃 電路佈線問題

2021-10-10 03:49:41 字數 1235 閱讀 6353

問題:

在一塊電路板的上、下兩端分別有n個接線柱。根據電路設計,要求用導線(i,π(i))將上端接線柱與下端接線柱相連,其中π(i)是的乙個排列。導線(i,π(i))稱為該電路板上的第i條連線。對於任何1≤iπ(j)。

電路佈線問題要確定將哪些連線安排在第一層上,使得該層上有盡可能多的連線。換句話說,該問題要求確定導線集nets=的最大不相交子集。

分析:

該問題和最長公共子串行問題屬於同一類問題,同樣需要關注序列的末端,不同的是由於本題的序列元素間已經存在了某種對映關係,所以在遞推時跨的步長更大。

——最優子結構:設s[i][j]為序列[1,i],[1,j]的最大不相交子集,那麼若i對應的接線柱π(i)>j,說明接線柱i已經不可能再被選中了,那麼s[i][j]=s[i-1][j];若i對應的接線柱π(i)<=j,說明接線柱i可能被選中,那麼就有兩種情況,選與不選,假如選了,那i就去掉,同時π(i)以及序號大於它的接線柱也不可能被選中了,因為假如被選了,那就有相交了,所以s[i][j]=s[i-1][π(i)-1]+1,假如不選,那就是s[i][j]=s[i-1][j],子結構滿足最優子結構性質。

——確定遞推關係:s[i][j]=s[i-1][j],π(i)>j;s[i][j]=max(s[i-1][π(i)-1]+1,s[i-1][j]),π(i)<=j。

——確定最優解:開闢乙個二維陣列b,記錄s的每個狀態對應的最優選擇,然後重走革命路。

**:

#include using namespace std;

#define maxn 105

// 求最優值,即各個子問題最大不相交子集的大小

// 輸入:序列pi,子問題最優值記錄矩陣s,最優解記錄矩陣b,pi長度n

void mns(int pi,int s[maxn],int b[maxn],int n)

else

}// 根據遞推公式計算解空間

for(int i = 2;i <= n;i++)elseelse}}

}}// 根據記錄矩陣b還原最優解

void traceback(int b[maxn],int pi,int i,int j)

if(b[i][j] == 1)

if(b[i][j] == 2){// 行為2,選這個下層接線柱

traceback(b, pi, i-1, pi[i-1]-1);

cout《時間複雜度和空間複雜度都是o(n2)

動態規劃 電路佈線問題

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 ...

動態規劃電路佈線

電路佈線簡介 舉例及其詳細說明 塊測試結果 在一塊電路板的上下兩端分別有n個接線柱。根據電路設計,要求用導線 i,i 將上端接線柱i與下端接線柱 i 相連,如圖,其中,i 1 i n,是 1,2 n 的乙個排列.導線 i,i 稱為該電路板上的第i條連線.對於任何1 i小於j n,第i條連線和第j條連...