跟进:找到停止固定次数的最佳停靠顺序

时间:2017-10-23 02:41:56

标签: algorithm dynamic-programming greedy

我正在尝试编写以下问题:

0 1 ,..., n 中有n个酒店,其中0 <&lt; a 0 &lt; a 1 &lt; ......&lt;一个<子>名词。您可以停止的唯一地点是这些酒店,但您可以选择您停在哪家酒店。您必须在最终的酒店(距离 n )停留,这是您的目的地。此外,您需要在d天内完成您的旅程(即必须在其间进行d-1次停靠)。如果您在一天内行驶x英里,那天的费用是x 2 。您希望计划行程,以便最大限度地降低总成本 - 即每日成本的总和。找到最佳的酒店序列。

我提出了这个dp解决方案:

dp(i)为最低费用,以便最后一站是酒店i。 基本情况:dp(0)=0

为了计算dp(i),我考虑了之前可能停止过的所有可能的位置0<=k<i。因此,递归关系变为:

for i=1;i<=n;i++
  dp(i)=inf
  prev(i)=undefined
  for k=0;k<i;k++
    if (dp(i)>dp(k)+(ai-ak)^2)
      dp(i) = dp(k)+(ai-ak)^2)
      prev(i) = k 

我们如何确保此算法完全停止?

1 个答案:

答案 0 :(得分:0)

我也在你之前的问题上写了这个答案,但我认为你忽略了它。无论如何,请告诉我这种方法是否有用。

您的算法将为您提供止损位置(int [] k),这样可以在不考虑d的情况下最大限度地降低成本。我从你的问题中得出你想要将这些k站点转换为d站点。

有3例:

1)

  

k.length == d;

问题解决了

2)

  

k.length&lt; d;

while(k.length!= d)求所有n的(n-1)和a(n)之间的最小距离(min)。从第一家酒店开始穿越。找到a(n) - a(n-1)为min的第一个出现位置。现在如果这两家酒店都在你的k中,找到下一个出现的地方,否则打破你的止损,把它作为一个单独的止损包括在k并重复。

如果你到达酒店的尽头,你可以用第二个最小距离等来做到这一点,直到收敛。

3)

  

k.length&gt; d;

while(k.length!= d)这次你需要找到k中两个邻居之间的最小距离。将两个邻居合并为一站,直到收敛。

我不确定这种方法是最优的还是正确的,但这些是我的两分钱。