問題:
在一塊電路板的上、下兩端分別有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條連...