転送:https://blog.csdn.net/liufeng_king/article/details/8671407
問題の1説明:
それぞれ、回路基板上に、n個の端子の下端。以下に示すような回路設計、ガイドワイヤの要件(I、[PI](I))と上部端子スタッドI、π(i)の下端が、連結されています。ここで、π(I)、1≤iは≤n、{...、1,2、N}である置換です。鉛(I、π(I))は、回路基板上のi番目のワイヤと呼ばれます。任意の1≤iについては、π(I)>π(j)をj個の≤n、交差i番目とj番目の接続配線のための必要十分条件である≤します。
π(I)= {} 8,7,4,2,5,1,9,3,10,6
回路基板の製造において、ワイヤのこれらの要件nは、複数の絶縁層上に分布します。同じ層上の配線が交差していません。多くの配線層として存在するように、第1配線層の上に配置された配線を決定する問題。換言すれば、問題は最大の互いに素な部分集合{iがn≤1≤、I、π(I)}リード現在のネット=を決定するために頼みました。
2、次善構造特性:
。N(i、j)が最大の互いに素なサブセットMNSである(I | N(I、J)= {(T、π(T))∈ネットは、T≤I、π(T)≤J Tは}注、j)のサイズ(i、j)は= | MNS(i、j)を|。
(1)i = 1のとき
(2)の場合、I> 1の場合
①J <π(I)。この場合、(I、π(i))をN(i、j)はに属していません。したがって、この場合、N(i、j)は= N(I-1、j)は、それによってサイズ(I、J)=サイズ(I-1、J)。
②Jの≥π(I)。この場合、(I、π(i))を∈MNS(i、j)の場合、T <I及びπ(t)が存在する<π任意(T、π(t))を∈MNS(i、j)は(のためのI)、そうでなければ、(T、π(T))と(I、π(i))を交差します。この場合、MNS(I、J) - {(I、π(I))} N(I-1、π(I)-1)最大の互いに素なサブセットです。そうでない場合、サブセットMNSは、(i-1、π(i)は-1)∪{(π(I))} N(I、J)に含まれているMNS(i、j)が大きいN(私の比であります互いに素な部分集合の、J)。これは、のMNS(i、j)の定義と矛盾します。
(私は、π(i))がMNSトン<私と(i、j)は、その後、任意のための(T、π(t))の∈MNS(i、j)は、されていない場合。MNS(i、j)がN(I-1、j)は、従って、サイズ(i、j)は≤Size(I-1、J)に含まれます。
一方、MNS(I-1、J)N(i、j)の中に含まれるので、そこサイズ(i、j)は≥Size(I-1、j)は、それによってサイズ(I、J)=サイズ( I-1、j)を。
3、漸化式
最適値回路配線問題サイズ(N、N)。問題の準最適な構造特性から見た、準最適値再帰の問題は次のように
下から上に、次いで第一の端子の行だけカウント、最適な配線2、及び、最適な配線の複数の端子の行を見つけます。具体的なコードは次のよう:
// 3D8配線動的計画問題
の#include "STDAFX.H"
の#include <iostreamの>
使用して名前空間STD;
のconst int型N = 10;
ボイドMNS(C INT []、N-INT、INT **サイズ);
(トレースバックを無効C INT []、int型のサイズ**、N-INT、INTネット[]、INT&M);
int型のmain()
{
int型C [] = {0,8,7,4,2,5,1,9,3 、10,6は}; //インデックスが開始
INTサイズ=新しい新しいINT ** * [N + 1];
のために(INT I = 0;私は= N <; Iは++)
{
サイズ[I] =新しい新しいINT [ 1 + N];
}
MNS(C、N、サイズ);
COUT << "接続の最大数を交差配線はありません:" <<サイズ[N] [N] << ENDL;
INTネット[N]、M ;
トレースバック(C、サイズ、N、ネット、M);
COUTは、<< "最大の互いに素な接続がある:" << ENDL;
(INTのための1-M = I; I> = 0;。i--)
{
COUT << "(" <<ネット[I] << " "<< C [ネット[I]] <<")"。
}
COUT << ENDL。
0を返します。
}
ボイドMNS(INT C []、int型nは、INT **サイズ)
{
ための(int型J = 0; J <C [1]; J ++)
{
サイズ[1]〜[J] = 0;
}
のための(int型J = C [1]であり、j <= nであり、j ++)
{
サイズ[1]〜[J] = 1。
}
ため(INT I = 2; iがN <、iは++)
{
(int型J = 0; J <C [i]は、J ++)用
{
サイズ[I] [J] =サイズ[I-1]〜[J]。 //当iは<C [I]的情形
}
ための(int型J = C [i]は、J <= nであり、j ++)
{
//当J> = C [i]は时、考虑(I、C [I] )是否属于MNS(i、j)の的两种情况
サイズ[I] [J] = MAX(サイズ[1-I]、[J]、サイズ[-I 1] [C [I] -1] + +1);
}
}
サイズ[N-] [N-] = MAX( [N - 1]サイズ[N-]、サイズ[N - 1] [C [N-] -1] + +1);
}
ボイドトレースバック(C INT []、int型のサイズ**、N-INT、INTネット[]、 M&INT)
{
INT = N-J;
M = 0;
のための(INT I = N-; I> 1; i--)
{
IF(サイズ[I] [J] =サイズ[1-I]、[J])! //この場合、(I、C [I] )最大エッジ互いに素な部分集合
{
ネット[++のM] = I;
J = C [I] -1; //更新間隔拡張カラム接続
}
}
IF (J> = C [1] )// プロセス場合、I = 1
{
ネット[++のM] = 1;
}
}
アルゴリズムMNS時間と空間の複雑さが(N ^ 2)Oです。トレースバック時間複雑度はO(N)です。次のようにプログラムの結果は以下のとおりです。