電路布線【動態(tài)規(guī)劃】

Paste_Image.png

include <iostream>

using namespace std;

int max(int x, int y){

return x>y?x:y;

}

void MNS(int c[], int n, int **size){

//根據(jù)心中那張表初始化第一行
for(int j = 0; j < c[1]; j++){
    
    size[1][j] = 0;
} 

for(int j = c[1]; j <= n; j++){
    
    size[1][j] = 1;
}

//然后從第二行開始每一行填充那張表
for(int i = 2; i <= n; i++){
    
    //要是j<c[i]
    for(int j = 0; j < c[i]; j++){
        
        size[i][j] = size[i-1][j];
    } 
    
    //要是j>=c[i]
    for(int j = c[i]; j <= n; j++){
        
        size[i][j] = max(size[i-1][j], size[i-1][c[i]-1]+1);
    } 
}

size[n][n] = max(size[n-1][n], size[n-1][c[n]-1]+1);   

}

void TraceBack(int c[], int **size, int n, int net[], int &m){

int j = n;
    m = 0;
    
for(int i = n; i > 1; i--){
    
    if(size[i][j] != size[i-1][j]){
        
        net[m++] = i;
        j = c[i] - 1; 
    }
}

//處理i為1的情況【不能放一塊處理的原因是那張表下面沒值了】 
if(j >= c[1]){
    
    net[m++] = 1;
} 

}

int main(){

//首先輸入一個接好的線【便于測試】  
//int c[] = {0,8,7,4,2,5,1,9,3,10,6};

cout<<"輸入一共有幾個接線柱:"<<endl;

int n;

cin>>n; 

cout<<"依次輸入這個n個接線柱連著哪一個,空格隔開:"<<endl;

int c [n+1];

c[0] = 0;

for(int i = 1; i<=n ; i++){
    
    cin>>c[i];
} 

//開辟一個二維數(shù)組存入每種情況的最大值
int **size = new int* [n+1]; 

for(int i = 0; i <= n; i++){
    
    size[i] = new int[n+1];
}

MNS(c, n, size);

cout<<"最大不相交連線的數(shù)目為:"<<size[n][n]<<endl; 

int net[n], m;

TraceBack(c, size, n, net, m);

cout<<"最大不相交交連線為:"<<endl;

for(int i = m-1; i >= 0; i--){
    
    cout<<"["<<net[i]<<","<<c[net[i]]<<"]"<<" ";
} 

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容