【问题标题】:Minimum length routing path - Dynamic Programing最小长度路由路径 - 动态规划
【发布时间】:2016-04-01 20:06:41
【问题描述】:

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

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

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

在上面的例子中,长度是 31。

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

【问题讨论】:

  • 家庭作业?面试题?
  • 输入引脚和输出引脚是否在固定位置?否则答案很可能是3*N
  • 输入输出引脚在固定位置。
  • 引脚可以双向连接吗?意思是1 可以与左侧的0 连接吗?

标签: algorithm dynamic-programming greedy


【解决方案1】:

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

这些组中的每一个在不超出外线的情况下都可以具有最大线高的限制。第一个为 2,第二个为 5。

这给出了一个函数lineLength(leftPin, rightPin, maxHeight),它可以通过找到一个高度h和pini来获得它的值,这样h <= maxHeightpin[i]就在leftPin+1rightPin之间,而相反的类型是pin[leftPin].

那么行长就是rightPin-leftPin+2*h + lineLength(leftPin+1, i-1, h-1) + lineLength(i+1, rightPin-1, 5)

此函数有O(n^3) 可能的值,并且由于hi 的迭代,通过记忆计算每个值将需要O(n^2) 时间。所以总时间是O(n^5)

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

【讨论】:

    【解决方案2】:

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

    一般来说,第一个引脚必须与某物配对 - 配对的唯一选项是当引脚串具有偶数个输入和输出位时。因此,在示例中,#1 可以与 #8 或 #10 配对。

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

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

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

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

    【讨论】:

    • 如何在递归中跟踪高度?在 OP 的示例中(假设连接可以朝任一方向),将 3 与 6 连接意味着早期函数调用的高度不同,这似乎取决于嵌套配置。
    • 递归方法可以在包装对象中返回它的深度和成本——比如结构或某个类——这样调用者也可以计算他的成本并将深度加一,等等
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2020-10-03
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多