日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划--电路布线(circuit layout)

發布時間:2025/3/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划--电路布线(circuit layout) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《算法設計與分析》? --王曉東

題目描述:

  在一塊電路板的上、下2端分別有n個接線柱。根據電路設計,要求用導線(i,a(i))將上端接線柱與下端接線柱相連,其中a(i)表示上端點i對應的向端點的值。如圖所示:

題目要求是在給定的連線中,選取不相交連線的最大子集,即不相交連線的最大數目。并把最大不相交子集的情況給列舉處理啊。

解題思路:

  首先用a[i]數組表示與上面對應點相連線的下面的點,再用set[i][j]表示上面節點i與下面節點j連線的左邊(包括i j連線)的最大不相交連線的個數。

  于是就有公式:

        max(set[i-1][j], set[i][j-1]);? j != a[i]  

  

  set(i,j) =

        set[i-1][j-1] + 1;?? j == a[i]

然后就可以對每一個i,都對所以的j求一遍。這樣就可以得出結果嗎,set[n][n]即我們想要的結果。

最后通過回溯把結果輸出出來。

代碼實現

#include <stdio.h>#define MAX(a,b) ((a) > (b) ? (a) : (b))void circut(int a[],int set[][11],int n); void back_track(int i,int j,int set[][11]);int main() {int a[] = {0,8,7,4,2,5,1,9,3,10,6};int set[11][11];circut(a,set,10);printf("max set: %d \n",set[10][10]);back_track(10,10,set);printf("\n");return 0; }void circut(int a[],int set[][11],int n) {int i,j;for (i = 0; i < n; i++){set[i][0] = 0;set[0][i] = 0;}for (i = 1; i <= n; i++){for (j = 1; j <= n; j++){if (a[i] != j)set[i][j] = MAX(set[i-1][j],set[i][j-1]);elseset[i][j] = set[i-1][j-1] + 1;}} }void back_track(int i,int j,int set[][11]) {if (i == 0)return;if (set[i][j] == set[i-1][j])back_track(i-1,j,set);else if (set[i][j] == set[i][j-1])back_track(i,j-1,set);else{back_track(i-1,j-1,set);printf("(%d,%d) ",i,j);} }2013/9/27 21:11

?

  

?

轉載于:https://www.cnblogs.com/Jason-Damon/p/3343602.html

總結

以上是生活随笔為你收集整理的动态规划--电路布线(circuit layout)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。