最小长度路由路径 - 动态编程

时间:2016-04-01 20:06:42

标签: algorithm dynamic-programming greedy

一条线上有2 * N个引脚,其中N个是输入引脚,N个是输出引脚。每个输入引脚必须连接到单个输出引脚,反之亦然,如下图所示:

enter image description here

连接线只能在上半平面垂直和水平制作,连接线不能重叠。

问题是连接所有引脚时所有线路的最小长度是多少。

在上面的示例中,长度为31。

使用堆栈的贪婪方法,类似于匹配括号问题不是最佳解决方案。

2 个答案:

答案 0 :(得分:1)

如果查看1到8之间的最外面一行,则会将引脚分成两组。一个在2到7之间,另一个在9到10之间。

这些组中的每一组都对其可以具有的最大线高度有约束而不延伸超过外线。第一个为2,有些默认为第二个。

这给出了一个函数lineLength(leftPin, rightPin, maxHeight),它可以通过找到高度h和图钉i来获取其值,以便h <= maxHeightpin[i]介于{{}之间1}}和leftPin+1以及相反类型的rightPin

然后行长度为pin[leftPin]

此函数有rightPin-leftPin+2*h + lineLength(leftPin+1, i-1, h-1) + lineLength(i+1, rightPin-1, 5)个可能的值,并且由于O(n^3)O(n^2)的迭代,计算每个值并带有记忆,需要h时间。所以总时间为i

应该可以通过最大高度的二分搜索来改善这一点。

答案 1 :(得分:0)

分而治之可以将其降低到n ^ 2.

通常,第一个引脚必须与某些东西配对 - 并且其配对的唯一选项是当引脚串具有偶数个输入和输出位时。因此在示例#1中可以与#8或#10配对。

对于这些配对中的每一个,您将该线的成本添加到线内的子问题以及线外的子问题。

例如:如果我们配对1和8,那么

cost = recursiveCost (2,7) + recursivecost(9,end) + wireCost(1,8)

你还需要跟踪内部函数调用的最大递归深度,因为你需要它来计算wireCost(a,b)。