找到停止数量固定的最佳停靠顺序

时间:2017-10-22 03:05:43

标签: algorithm dynamic-programming backtracking

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

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

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

package averagewithmethods; import java.util.Scanner; public class AverageWithMethods { public static String numbers(){ Scanner in = new Scanner(System.in); System.out.print("Enter 5-10 numbers to be averaged: "); String str = in.nextLine(); return str; } public static double averager(String str){ double average = 0; return average; } public static void results(String str, double average) { System.out.println("The average of the numbers " + str + " is " + average); } public static void main(String[] args) { String input = numbers(); double average = averager(input); results(input, average); } } 为最低费用,以便最后一站是酒店i。 基本情况:dp(i)

为了计算dp(i),我考虑了之前可能停止过的所有可能的位置dp(0)=0。在以下答案的帮助下,递归关系变为:

0<=k<i

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

3 个答案:

答案 0 :(得分:0)

对“重复问题”评论感到抱歉。

你的算法会给你stop(int [] k)的位置,这会在不考虑d的情况下最小化你的成本。我从你的问题中得出你想要将这些k站点转换为d站点。

有3种情况:

1)

  

k.length == d;

问题解决了

2)

  

k.length&lt; d;

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

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

3)

  

k.length&gt; d;   

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

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

答案 1 :(得分:0)

实施您自己的min操作。当您做出选择时,将此选项(索引)写入并行数组,如aux[i] = k。计算后,从aux[n]

反向展开最佳序列

答案 2 :(得分:0)

如果存储了先前的停止,则可以回溯序列。

for i=1;i<=n;i++
 dp(i)=inf //you need to initialize this of course
 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 //storing the previous stop

然后你可以回溯prev(i)的序列:

function seq(i):
 if i==0
  return {}
 else
  return append(seq(prev(i)),prev(i))