【发布时间】:2019-10-10 05:33:48
【问题描述】:
假设我们有 n 个不相交的水平双杠。然后我们需要用一条垂直线连接每对条,所以总共有sum(n,...,1)条线。如果两个条之间的这些连接中的任何一个与其他条交叉 p 次,那么我们说成本是 p。问题是找到 n 根柱的最低总成本。
n=1, p=0: n=2, p=0: n=3, p=0 n=4, p=0:
--- -----
| | | | |
--- --- --- | --- | |
| | | | | | |
--- --- | --- |
| | |
-------
n=6, p=3:
-------------
| | | | |
| ----- | | |
| | | | | | |
| | | --- | |
| | | | | | |
--*-*-- | | |
| | | | |
| ----*-- |
| | | |
-----------
n=7, p=6:
---------------
| | | | | |
| --*---- | | |
| | | | | | | |
| | | --*-- | |
| | | | | | | |
| | --- | | | |
| | | | | | | |
| | | --*-*-- |
| | | | | | |
--*-*---- | |
| | | |
-------------
n=8, p=11
-------------------
| | | | | | |
| --1-1------ | | |
| | | | | | | |
| | --2---- | | | |
| | | | | | | | | |
| | | | | --1-- | |
| | | | | | | | | |
| | | --1-- | | | |
| | | | | | | | |
| | | | ----1-1-- |
| | | | | | | |
--1-1-1------ | |
| | | | |
-----------------
任何关于如何找到其背后的模式或逻辑的提示都会很棒。
【问题讨论】:
-
值得把问题说明得更清楚,放一张图更好理解,代表自己的努力。
-
不清楚您希望如何实现最低成本,因为已经给出了连接。你能重新排列垂直方向的条吗?
-
sum(n,...,1)看起来也很可疑(因为等于(n(n+1)/2)),所有的条对都是C_n^2,即n(n-1)/2 -
我认为 OP 试图问的是:如何排列 N 条水平线(任何长度并以任何偏移量开始),这样当您绘制连接每对线的垂直线时,它将导致最小交叉。例如 N = 1, Cost --> 0 N = 2, Cost --> 0 N = 3, 可以通过三种方式排列 3 条平行线imgur.com/a/SmsBmBL 配置 2 给出成本 0。因此最小成本为 0。类似地我尝试手动计算它。从 n = 1 开始。序列:0、0、0、0、1、3、4
-
也许你可以从给出这个算法的蛮力实现开始。因此,您将问题转换为一个程序,例如在 (n * sum(n-1, ... 1)) 数组上工作,绘制该数组中每个长度和位置的“条”,找到每对的最小成本线,并计算总成本。基于此,您可能会找到更快的解决方案。
标签: java algorithm combinations backtracking