我在高速公路上有一系列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解决方案?
答案 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)
中完成。