加油站式算法,成本最低?贪心还是DP?

时间:2014-01-27 06:41:28

标签: algorithm dynamic-programming greedy

我在高速公路上有一系列n服务站D[]D[i]是电台i距离高速公路起点的距离。

我还有一系列费用C[]C[i]是我的车辆在i站服务的费用。

我必须在第一站为我的车提供服务,我的车可以在车站之间最多行驶100英里。

从高速公路开始到最后以最低成本获得最有效的算法是什么(我需要知道要停在哪个站点)?我能够找到一个贪婪的解决方案来减少停止次数,但是以最低的成本,我正在考虑DP,具有最佳的子问题:

bestcost[j] = min( 0<i<j bestcost[i] + C[j] s.t. D[j]-D[i] <= 100)

并有一个单独的数组last[j],其中包含要停止的最后一个工作站,这将是来自子问题的最佳i

这是正确的方法,还是有更好的Greedy / DP解决方案?

2 个答案:

答案 0 :(得分:1)

复发更好地写为

bestcost_serviced_at[j] =
  min(0<i<j: bestcost_serviced_at[i] + C[j] s.t. D[j]-D[i] <= 100)

因为假设车辆实际停在车站j进行维修,重现会产生最佳成本。

然后解决问题的方法是

min (j: bestcost_serviced_at[j] s.t. highway_end - D[j] <= 100)

我不认为贪婪算法会起作用。

答案 1 :(得分:0)

我认为你的DP有点不完整,这是一个更复杂的DP复发: -

if(highway_end-D[i]>100) {

   minCost[i] = min(0<i<j && D[j]-D[i] <= 100 : minCost[j]+C[i])
} 

else  minCost[i]  = C[i]     

minCost[i] = minimum cost to reach destination if you have filled up at i

根据起点距离对站点进行排序,并在较高站点到较低站点距离内使用DP。使用有序数组查找距离100英里远的邻近站点。

修改: -

可以使用min heap在O(NlogN)中完成。