鉴于从点x到点y的两条付费道路,找到最便宜的道路

时间:2017-08-02 14:35:18

标签: arrays algorithm graph dynamic-programming

鉴于:两条道路,L和R,它们都从点x开始,到y点结束。

他们都是付费道路,他们在L路上的路l1,l2,..,ln和R路上的r1,r2,...有n个有偿点,你必须支付当你越过这一点时。

如果你想继续驾驶从R路而不是L(或从L路而不是R路)指向y,你必须支付不断变化的道路费(但不是支付点)。意思,如果你离开点i,你不需要支付积分或者ri,而只需支付不断变化的道路费,然后你继续在你所在的新路上的i + 1点(R或L) - 而你必须支付l(i + 1)或r(i + 1)。道路收费变化点由s1,s2,... sn。

定义

示例:如果我在R路的第3点,我选择继续开车从路L开始指向y,我只需支付s3(而不是r3),然后我支付l4太

问题:在DP中解决此问题,找出从x到y的最便宜的方式,时间复杂度最高。

我想出了一个我认为不会一直无法运作的解决方案,我希望你能帮助我建立一个更好的工作。

定义:由于(ri,ri + 1),图G,2n个顶点,边是(li,li + 1),(li,ri),甚至是3n个顶点。大小为n的数组,称为x。所以x [i]将保持最低成本路线的值,直到索引i。我们将从n到1填充数组。我们将初始化数组的值为零。公式如下。 A [i] = min {A [i + 1] + xi,A [i + 1] + si + x_(i + 1)]}。最后,我们返回A [1]。

我相信这有时会失败,如果这是真的,我很乐意帮助他们改变它以正常工作或找到另一种算法来完成这项工作。

1 个答案:

答案 0 :(得分:1)

即使您的配方有一些不明确的地方,我仍然会发布我的解决方案并在必要时添加说明。

图论方法

你构造2n顶点图的转换绝对是明智的,因为你的问题成了最短的路径问题。

如果您将ri 的费用道路费用分配到边缘(ri, r(i+1))道路费用li 到边(li, l(i+1))道路切换费用到边(ri,l(i+1))(li,r(i+1)),从x到y的最短路径也是模型中最便宜的路径。

动态编程公式

由于图形的结构,您不需要像Dijkstra这样的最短路径算法,类似于您提出的解决方案应该足够简单。但是,在存储数组x时,您无法确定到达某个位置的最佳解决方案是否应该在R或L路上结束。

解决此问题的一种简单方法是为每个付费点ri和li存储最短路径,即存储两个阵列AR和AL,其中AR [i]是到达ri的最佳成本(和AL [i] ]对于li)

简单的DP配方将是

AR[1] = AL[1] = 0 // We don't need to pay at the start
// either stay on the road or switch the road and pay changing fee:
AR[i + 1] = min(AR[i] + fee at ri, AL[i] + changing fee si)
AL[i + 1] = min(AL[i] + fee at li, AR[i] + changing fee si)

并通过取最小值AR [n + 1]和AL [n + 1]来计算最小成本。要获得实际的道路,只需回溯每次min计算时选择的内容。