算法--电路布线问题

在一块电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线将上端接线柱与下端接线柱相连

 

如上图所示,每个节点有且只连有一条线。
在制作电路板时,要求将这n条连线分布到若干绝缘层上。在同一层上的连线不相交。
这个问题是要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线(不相交)。
为了解决这个问题,我们可以 将问题简化为这样:
设定上接线柱为1,2,3,....,n。
下接线柱是【 1,2,3,....,n】的一个排列 设为f(i),i的值就是上接线柱的数字,
如上图就是这样的模型:
i    1    2     3    4   5   6    7    8     9    10
f(i) 8,7,4,2,5,1,9,3,10,6
它们一一对应。 
我们还必须得到这样一个结论:
对于上接线柱i1<i2<i3<...<ik来说。它们与下接线柱f(i)的连线之间互不相交的充要条件是:
f(i1)<f(i2)<...<f(ik)。这个结论是很显然成立的。
因为对于i1<i2如果f(i1)>f(i2)则它们一定相交(画出图像来看看)
因此,我可以将这个电路布线问题,转化为这样的问题:
已知有一个{1,2,3,...,n}的排列,将其拆分为k个子排列,并且每个子排列都是严格递增的,求子排列的最大元素个数。
例如:排列 8,7,4,2,5,1,9,3,10,6可以拆分成五个子排列{4,5,9,10}{8}{7}{2,3,6}{1} 。
它最大的元素个数是4。
排列 1,2,3,4,5,6,7,8,9,10它是递增的,所以无需拆分,最大元素个数是10。
算法实现:
对于排列8,7,4,2,5,1,9,3,10,6。
先将记录第一个值8,依次向后扫描至大于8的元素。如果发现8的元素,例如9,则我可以产生一个子排列{8,9}(实际上只需要更改元素数量和最大值即可),继续扫描。
产生子排列{8,9,10}。扫描完毕后姑且认为子排列最大元素是3个。
第二次以7向后扫描,只要扫描到比它大的,就将产生一个子排列,继续向后扫描,扫描结束后,得到排列是{7,9,10}。个数是3,与之前的比较。
第三次以4开始扫描,。。。依次下去至扫描结束。 
使用递归算法代码简单,算法复杂度为O(N*N)

 

#include <iostream>
using namespace std;
#define N 10

int sub[N] = { 2, 7, 3, 4, 5, 6, 9, 8, 10, 1 };

int function(int MaxElem,int e=0,int counts=1)
{
    if (e==N-1)
    {
        //递归的出口
        if (sub[e] > MaxElem) counts++;
        return counts;
    }
    else
    {
        if (sub[e]>MaxElem)
        {
            MaxElem = sub[e];
            counts++;

        }
        return function(MaxElem,e+1,counts);
    }

}

int main()
{
    int max = 0,t;
    for (int i = 0; i < N; i++)
    {
        if ((t = function(sub[i]))>max) max = t;
    }
    cout << max << endl;

    return 0;
}
时间: 2024-12-19 16:36:44

算法--电路布线问题的相关文章

算法设计与分析——电路布线(动态规划)

一.问题描述 在一块电路板的上下两端分别有n个接线柱.根据电路设计,要求用导线 (i,π(i)),将上端接线柱 i 与下端接线柱 π(i) 相连,如图,其中 π(i),1<=i<=n,是(1,2……,n)的一个排列.导线(i,π(i))称为该电路板上的第i条连线.对于任何 1<=i<s<=n,第i条连线和第s条连线相交的充分且必要条件是 π(i) > π(s). 在制作电路板时,要求将这n条线分布到若干个绝缘层上,在同一层上的连线不能相交.电路布线问题要确定将哪些连线安

【动态规划】电路布线问题

算法笔记--[动态规划]电路布线问题 原创 2013年03月14日 09:18:27 标签: 电路布线 / 算法笔记 / 动态规划 / 最优子结构 12785 1.问题描述: 在一块电路板的上.下两端分别有n个接线柱.根据电路设计,要求用导线(i,π(i)) 将上端接线柱i与下端接线柱π(i)相连,如下图.其中,π(i),1≤ i ≤n,是{1,2,-,n}的一个排列.导线(I, π(i))称为该电路板上的第i条连线.对于任何1 ≤ i ≤ j ≤n,第i条连线和第j条连线相交的充要条件是π(i

电路布线问题

1.问题描述:从起点到终点所走过的最短路线. 分析:用到队列来进行存储. 2.代码实现 因为要用到队列,所以用C++实现更好. #include<iostream> #include<queue> #include<time.h> #include<ctype.h> using namespace std; #define ROW_COUNT    8 #define COL_COUNT    8 #define WALL        1 #define 

电路布线与两点间的最短距离

就是一个简单的bfs的问题,这里用队列来解决问题,有栈来输出路径. #include"iostream" #include"stdio.h" #include"algorithm" #include"queue" #include"string.h" #include"cmath" #include"stack" using namespace std; int vi

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

归并排序 求逆序数 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 首先考虑下如何将将二个有序数列合并.这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数.然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可. //将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c

高速信号要避免紧挨平行布线–PCB Layout 跳坑指南

高速信号要避免紧挨平行布线–PCB Layout 跳坑指南 高频高速PCB设计 by xfire PCB Layout 跳坑指南 高速电路布线要注意信号线间近距离平行走线所引起的串扰,若无法避免平行布线,可在平行信号线的相邻层铺大面积的"地铜"来减少线间串扰.相邻层之间的高速信号走线的方向也需要尽量做到相互垂直.

[转]PCB布线设计

原文链接:http://download.eeworld.com.cn/detail/%E5%B8%B8%E8%A7%81%E6%B3%BD1/8623 一.PCB布线设计1 在当今激烈竞争的电池供电市场中,由于成本指标限制,设计人员常常使用双面板.尽管多层板(4层.6层及8层)方案在尺寸.噪声和性能方面具有明显优势,成本压力却促使工程师们重新考虑其布线策略,采用双面板.在本文中,我们将讨论自动布线功能的正确使用和错误使用,有无地平面时电流回路的设计策略,以及对双面板元件布局的建议. 1.1 自

超强PCB布线设计经验谈附原理图(转自电子工程专辑亿万家园博客)

在当今激烈竞争的电池供电 市场中,由于成本指标限制,设计人员常常使用双面板.尽管多层板(4层.6层及8层)方案在尺寸.噪声和性能方面具有明显优势,成本压力却促使工程师们重新考虑其布线策略,采用双面板.在本文中,我们将讨论自动布线功能的正确使用和错误使用,有无地平面时电流回路的设计策略,以及对双面板元件布局的建议. 自动布线的优缺点以及模拟电路布线的注意事项设计PCB时,往往很想使用自动布线.通常,纯数字的电路板(尤其信号电平比较低,电路密度比较小时)采用自动布线是没有问题的.但是,在设计模拟.混

LSI设计(4)FOCR快速最优通道布线

 [email protected]   [摘要]本文提出的快速最优通道布线算法FOCR(Fast Optimal Channel Router)是Kernighan-shweikert-Persky 最优通道布线算法[2]和wada的改进布线算法[4]的改进.这些算法的"最优性"意义完全相同,但新算法的执行速度统计地比上述二种法远远为快. 1.引 言  通道布线算法是大规模集成电路(LSI)和印刷电路板(PCB)布线设计中广泛应用的一类算法,其特点是采用并行布线方式,因而与串行布线的