Algorithm 在间隔/点上优化DP

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]

这个问题很容易在O(n3)时间内简单地解决。问题是这样的:

一条数字线上有N个唯一点。你想报道每一件事吗 数字线上的一个点,有一组间隔。你可以 在任何地方放置一个间隔,创建一个间隔需要花费
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)
    ?您仍然需要对输入进行排序。这需要的不仅仅是线性时间。