【问题标题】:Minimum cost of travel path using dynamic programming使用动态规划的最小旅行路径成本
【发布时间】:2019-10-16 04:24:54
【问题描述】:
假设我们要从 A 到 B,在旅行过程中,有一些站点 d_1,...,d_n 其中 d_1=A, d_n=B,我们可以选择在每个站点添加燃料成本 C_i,假设如果我们在 d_i 站加气,那么我们可以行驶 a_i 多公里。我想找到一种动态规划算法来找到前往 B 的最低成本(假设存在这样的序列)。
我尝试使用 D[i] 作为从 A 到车站 i 的最低旅行成本,但我无法弄清楚递归关系。我想我可能需要跟踪我们目前可以旅行多长时间。但这太复杂了……
【问题讨论】:
标签:
algorithm
dynamic-programming
【解决方案1】:
正如您所说,您可能需要跟踪我们目前可以旅行多长时间。
您应该使用 D[i][j] 作为从 A 到站 i 并留下 j 公里燃料的最低成本。
在这种情况下,递归关系如下。
D[i][j] = min( min{ D[i-k][j+(d_i - d_{i-k})] | k<i }, D[i][j-a_i] + C_i );
第一个词min{ D[i-k][j+(d_i - d_{i-k})] | k<i }表示从i-k站移动到i站,(d-i - d_{i-k})公里油耗。
k 可以取 0 到 i-1 之间的值。
第二个术语D[i][j-a_i] + C_i 表示在d_i 站添加a_i 公里汽油,C_i 成本消耗。
此外,如果您允许在同一站点多次添加气体,则必须小心。
最后,min{ D[n][*] | '*' is any positive value } 成为答案。
【解决方案2】:
我们可以根据数据考虑可以修剪搜索空间的潜在优化。选择d_1 的可能性会产生一个(cost, distance) 元组。在d_i,我们通过将cost_i 和distance_i 与之前的元组组合来生成新的元组,保留所有(cost, distance) 元组,其中距离大于d_(i+1),并且没有元组同时具有更高的成本和更低的距离其他。换句话说,我们不想将加油站i 与之前的元组 where 一起使用
prev1.cost + c_i ≥ prev2.cost
prev1.dist + d_i ≤ prev2.dist
for some (prev1, prev2)
我们可以在几何上将这种关系视为点对之间的零斜率或负斜率。
distance
| b
| f
| c
| e
| a d
|
-----------------cost
c --> e、c --> d 和 a --> d 具有非正斜率意味着 a 和 c 总是更好的选择,因此我们可以丢弃 d 和 e。我们正在寻找沿成本维度严格增加距离的序列,而不是凸包。从最低成本开始(打破平局的距离更高),注意到greater-cost-with-equal-or-lower-distance 从来没有一个有用的点。
在每次迭代中,如果我们保持元组按成本排序,我们可以从第一个等于或大于d_(i+1) 的距离开始从低到高扫描(丢弃左侧的任何点),丢弃任何带有更大或相等的成本,但更低或相等的距离。