给定n个树的高度,找到最大化剩余树高度总和的切口



给定n个非负数a_1,a_2。。。,a_n,其中每个表示坐标(i,a_i(处的一个点,绘制表示树高度的n条垂直线,使得线i的两个端点位于(i,a_i(和(i,0(处。

树木的切割方式必须使其顶部呈直线(不一定与地面平行(。第一棵树或最后一棵树可以被移除,在这种情况下,被移除的树的根必须与其他树的顶部对齐。

砍伐后树的最大高度和是多少?

示例:

输入:1246.00

输出:12.00

图像示例

我的最佳解决方案以时间复杂性O(N^2(运行,其中我假设最佳切割必须包括两棵树的顶部,因此对于每棵树的每个顶部,我都试图找到另一个最大化总和的顶部。

关于如何解决时间复杂度低于O(N^2(的问题,有什么想法吗?

技巧。

假设i < j < k(j, a_j)位于从(i, a_i)(k, a_k)的线上。然后,定义最佳切割的两棵树不通过(j, a_j),因为它必须高于另一棵树。

因此,我们可以从左边开始,向前走,将树木从考虑范围中删除,直到剩下的树木上方的区域凸起。也就是说,我们观察点0、1和2,决定是否消除1。然后取第3点,看看我们是否可以在后面消除第2点。等等。

这在时间O(n)结束。现在我坚持认为,你的最佳切割是从剩下的一个点到下一个点,或者从两端的0到其中一个点。这可以在时间O(n)中再次检查,因为如果是2个连续的剩余点,我们已经知道所有点都在上面,并且只需要检查两端是否低于0。

这应该需要O(n)

正如btilly所观察到的,LP是一种自然拟合。我们有两个变量斜率m和截距b,约束条件0≤m i+b≤ai。目标是最大化∑i(mi+b(。LP具有两个变量可以在线性时间内求解。

Seidel提出的一种简单的随机LP求解算法是:如果最多两个约束,只是以某种方式解决问题。否则移除随机约束并递归地解决问题。如果得到的解决方案不会违反已删除的约束,那么它对于原始问题是最优的。否则,删除的约束为牢固的替代并求解一元问题。

最新更新