電路布線【動態規劃】

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){

//根據心中那張表初始化第一行
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];
} 

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

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

MNS(c, n, size);

cout<<"最大不相交連線的數目為:"<<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]]<<"]"<<" ";
} 

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。