我遇到了这个问题:
你必须在一个城市的N
街区中穿过0
区块开始,然后在区块N - 1
处结束。每个区块i
都有一个加油站,从区块到区块以西X[i]
英里和区块以东Y[i]
英里处提供天然气输送。加油站仅在支付初始金额C[i]
时为您提供服务。假设所有街区都在一条直道上。提供一种算法,选择加油站支付,使支付给加油站的现金最小化,至少有一个加油站在道路上的每个位置交付。
我尝试的事情:
经过激烈的斗争后,我得出结论,这可能是一个动态编程问题。
尝试动态编程 - 我试图想出一个绝对没有结果的复发,我发现最困难的部分是该站在两侧传送。为了解决这个问题,我决定将车站“移动”到最西侧的位置,并将东部的交付范围增加相同的数量 - 无法继续。
我发现了一个类似的问题,dynamic programming proboem for minimum cost 这些问题实际上是否相似?
有人可以告诉我这是否实际上是一个动态编程问题而且没有其他方法可以更有效地执行此操作? 如果是动态编程,请您提供一些关于如何进行此操作的提示?
Suppose N is 4
block 0 : X = 1, Y = 1, C = 2
block 1 : X = 0, Y = 2, C = 1
block 2 : X = 2, Y = 2, C = 5
block 3 : X = 1, Y = 5, C = 7
Then the result will be,
Pay block 0, 1 gas stations.
Min cost : 3
答案 0 :(得分:2)
据我所知,我们希望能够覆盖所有街区的最低成本加油站。这可以表示为下图中的最短路径问题。为每个加油站创建一个人工源,一个人工水槽和一个顶点。对于i < j
,i
加油站在j
加油站有一个弧线,当且仅当它们的覆盖范围没有间隙时。人工源的每个加油站都有弧形,覆盖了区块0
。人造水槽的每个加油站都有弧形,覆盖了区块n-1
。每个弧的成本是其头部加油站的成本(人工水槽0
)。找到从源到水槽的最短路径;我们沿途访问的顶点是我们应该从中购买保险的加油站。
对于非循环有向图,运行时间为O(n^2)
,采用通常的线性时间最短路径算法。 O(n)
可能有所改善;见discussion on CS。 (Yuval指定O(n log n)
时间,但这仅仅是因为他在不同的计算模型中工作,其中排序为Omega(n log n)
。)