Algorithm 在间隔/点上优化DP
这个问题很容易在O(n3)时间内简单地解决。问题是这样的: 一条数字线上有N个唯一点。你想报道每一件事吗 数字线上的一个点,有一组间隔。你可以 在任何地方放置一个间隔,创建一个间隔需要花费Algorithm 在间隔/点上优化DP,algorithm,Algorithm,这个问题很容易在O(n3)时间内简单地解决。问题是这样的: 一条数字线上有N个唯一点。你想报道每一件事吗 数字线上的一个点,有一组间隔。你可以 在任何地方放置一个间隔,创建一个间隔需要花费B+MX 间隔,其中B是创建间隔的初始成本,以及 X是间隔长度的一半,而M是每个间隔的成本 间隔的长度。你想找到最低成本来支付每一笔费用 单间隔 样本数据: Points = {0, 7, 100} B = 20 M = 5 因此,最佳解决方案是57.50,因为您可以以20+3.5×5的成本构建区间[0,7]
B+MX
间隔,其中B
是创建间隔的初始成本,以及
X
是间隔长度的一半,而M
是每个间隔的成本
间隔的长度。你想找到最低成本来支付每一笔费用
单间隔
样本数据:
Points = {0, 7, 100}
B = 20
M = 5
因此,最佳解决方案是57.50,因为您可以以20+3.5×5的成本构建区间[0,7],以100+0×5的成本构建区间[100100],总计57.50
我有一个O(n3)解决方案,其中DP是覆盖[左,右]
点的最低成本。因此,答案将出现在DP[1][N]
中。对于每一对(i,j)
我只是迭代k={i…j-1}
并计算DP[i][k]+DP[k+1][j]
然而,这个解是O(n3)(我认为有点像矩阵乘法),所以在N>2000时速度太慢。有什么方法可以优化它吗?这里有一个二次解决方案:
p
A
,以便A[k]
是覆盖第一个k
点的最低成本。将A[0]
设置为零,将所有其他元素设置为无穷大k
从0
到n-1
以及每个l
从k+1
到n
,设置A[l]=min(A[l],A[k]+B+M*(p[l-1]-p[k])/2代码>
A[n]
是覆盖所有n
点的最低成本。(我们考虑了所有可能的最小覆盖间隔,并在某种意义上从“左到右”进行了考虑。)
您可以加快速度,使其在O(n logn)时间内运行;将步骤3替换为以下内容:
设置A[1]=B
。对于从2
到n
的每个k
,设置A[k]=A[k-1]+min(M/2*(p[k-1]-p[k-2]),B)
这里的想法是,我们要么延长上一个间隔以覆盖下一点,要么在p[k-2]
结束上一个间隔,然后在p[k-1]
开始一个新的间隔。我们唯一需要知道的是两点之间的距离
还要注意,当计算
A[k]
时,我只需要A[k-1]
的值。特别是,您不需要存储整个数组A
;只有它的最新元素。您还可以解释一下您是如何在第二个解决方案的复杂性上得出O(n log n)
的吗?不应该是O(n)
?您仍然需要对输入进行排序。这需要的不仅仅是线性时间。