给出了一个地点,用矩阵表示,每个条目表示该地区的汽车数量。我们的任务是将一个汽油泵放在矩阵的一个入口处,这样我们选择的块就可以降低旅行成本。
我找到了一个解决方案,花费O(n^4)
时间来计算每个条目的整个过程。
你能告诉我这个问题的其他任何好方法吗?
答案 0 :(得分:4)
如果我已正确理解你的问题,那么你的成本函数正如Haile在他/她的评论中描述的那样,有一个简单的解决方案,因为你可以减少到一维问题。
请注意,在曼哈顿指标中,汽车必须经过的列中的距离只是与行中的距离相加,因此我们可以单独将它们最小化。
因此我们将问题缩小到一个维度。为了弄清楚发生了什么,我不得不把它改成一个连续的问题。所以假设我有一个密度函数p(x),(假设它是连续的紧凑支持,所以数学有效)。然后成本函数由
给出
将这个分成两半以摆脱mod符号并区分(这是你需要假设p(x)表现良好的地方),你得到
现在,x0的最佳位置将是使该导数为零的位置。但请注意,这是分布的中位数。
对于离散设置,这是原始问题,相同的参数有效。基本上你可以采用离散导数,即E(k + 1)-E(k)。如果你为位置n的汽车数量写了[n],那么成本函数就会分解为
假设我没有犯下一个愚蠢的错误,那么离散导数就是
所以解决方案将再次处于中位数(如果最终为半整数,则以任一方式舍入)。要知道为什么这是真的,请注意,如果k是一个较大的负数,则此导数肯定是负数(因此将k增加1将降低成本)。现在,随着k增加,导数缓慢增加。在某些时候,它将首次成为积极的。一旦k + 1大于中值,就会发生这种情况。之后,它将保持正值,因此选择正确的k是小于或等于中位数的最大k。
原始问题是二维的,所以你需要运行两次,每个轴运行一次。
答案 1 :(得分:4)
我将用一个实际的例子来扩展鲁珀特的答案(即如何计算他称之为中间行和列的内容)。
正如他所说,您可以分别找到泵的最佳行和最佳列。怎么样?
让我们考虑以下问题的实例:
3 2 7
1 8 9
7 2 2
我们开始添加矩阵的所有行
3 2 7 -> 12
1 8 9 -> 18
7 2 2 -> 11
现在如果我们将泵放在第一行,总垂直成本是
11*2 + 18*1 + 12*0 = 30
由于第3排的11辆汽车必须行驶2个垂直单元,因此第2排的18辆汽车必须行驶1个垂直单元,第1排的汽车不必垂直行驶。我们必须计算所有行的总垂直旅行成本。
pump in 1st row -> cost 30 = 11*2 + 18*1 + 12*0
pump in 2nd row -> cost 23 = 11*1 + 18*0 + 12*1
pump in 3rd row -> cost 42 = 11*0 + 18*1 + 12*2
所以泵的最佳行是第二行。
我们在O(n ^ 2)中计算了这个,因为我们在 n 行中对所有 n 汽车求和时得到了O(n ^ 2)和,当我们计算泵的每个可能行的总垂直成本时,我们做了O(n ^ 2)和和乘法。
我们总结每列中的汽车:
3 2 7
1 8 9
7 2 2
_______
11 12 18
现在:
pump in 1st col -> cost 48 = 11*0 + 12*1 + 18*2
pump in 2nd col -> cost 29 = 11*1 + 12*0 + 18*1
pump in 3rd col -> cost 34 = 11*2 + 12*1 + 18*0
所以泵的最佳色谱柱是第二个。
在O(n ^ 2)步骤中,我们发现必须将泵置于[2] [2] 中。