我正在尝试编写以下问题:
在 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
我们如何确保此算法完全停止?
答案 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中两个邻居之间的最小距离。将两个邻居合并为一站,直到收敛。
我不确定这种方法是最优的还是正确的,但这些是我的两分钱。