我正在尝试编写以下问题:
在 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
我们如何确保此算法完全停止?
答案 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))