【问题标题】:Maximize sum of weights with constraints given on left and right indices in array在数组中给定左右索引约束的情况下最大化权重总和
【发布时间】:2017-11-12 06:07:46
【问题描述】:

我最近遇到了一个有趣的编码问题,如下:

有 n 个盒子,让我们假设这是一个由 n 个盒子组成的数组。

对于这个数组的每个索引i,给出三个值-

1.) 重量(i)

2.) 左(i)

3.) 右(i)

left(i) 表示 - 如果选择了weight[i],则不允许我们从该ith element 左侧选择left[i] 元素。

同样,right[i] 表示如果选择了arr[i],则不允许我们从它的右边选择right[i] 元素。

示例

重量[2] = 5

左[2] = 1

右[2] = 3

然后,如果我在位置 2 选择元素,我会得到 5 个单位的重量。但是,我无法在位置 {1} 处选择元素(由于左约束)。并且无法在 {3,4,5} 位置选择元素(由于右约束)。

目标 - 我们需要计算我们可以选择的权重的最大总和

示例测试用例:-

**输入:**

5

2 0 3

4 0 0

3 2 0

7 2 1

9 2 0

**输出:**

13

注意 - 第一列是权重,第二列是左约束,第三列是右约束

我使用动态编程方法(类似于最长递增子序列)来获得O(n^2) 解决方案。但是,想不出O(n*logn) 解决方案。 (n can be up to 10^5.)

我还尝试使用优先级队列,其中(right[i] + i) 值较低的元素被赋予更高的优先级(为“i”值较低的元素分配更高的优先级,以防主键值相等)。但是,它也给出了超时错误。

还有其他方法吗?或优先队列方法的任何优化?如果需要,我可以发布我的两个代码。 谢谢。

【问题讨论】:

  • 回复:“但是,它也给出了超时错误”:你能链接到你从哪里得到这个问题吗?
  • 我发现您的问题描述方式令人困惑。盒子?左/右重量?我认为如果你能更好地描述问题,你可能会更好地解决它!
  • @Aryan,对不起,我看不出答案是 13
  • @ShihabShahriar 将选择第 2 和第 5 个元素(权重分别为 4 和 9),因为这是我们在不与左右约束冲突的情况下可以获得的最大权重。
  • @AryanSharma,你能分享一下问题链接吗?

标签: arrays algorithm dynamic-programming priority-queue


【解决方案1】:

一种方法是使用binary indexed tree 创建一个数据结构,以便在 O(logn) 时间内轻松完成两个操作:

  1. 将数字插入数组
  2. 在给定范围内查找最大值

我们将使用此数据结构来保存通过选择框 i 以及左侧框的最佳选择可以实现的最大权重。

关键是我们只有在到达满足正确约束的点时才会将值插入到这个数据结构中。

要找到框 i 的最佳值,我们需要在数据结构中找到直到位置 i-left[i] 的所有点的最大值,这可以在 O(logn) 内完成。

最后的算法是遍历 i=0..n-1 并且对于每个 i:

  1. 通过在 0..(i-left[i]) 范围内找到最大值来计算框 i 的结果
  2. 安排到达位置 i+right[i] 时添加的结果
  3. 将任何先前计划的结果添加到我们的数据结构中

最终结果是整个数据结构中的最大值。

总体而言,复杂度为 o(nlogn),因为 i 的每个值都会导致一次查找和一次更新操作。

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多