Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在数组中左右索引上给定约束的情况下,使权重之和最大化_Arrays_Algorithm_Dynamic Programming_Priority Queue - Fatal编程技术网

Arrays 在数组中左右索引上给定约束的情况下,使权重之和最大化

Arrays 在数组中左右索引上给定约束的情况下,使权重之和最大化,arrays,algorithm,dynamic-programming,priority-queue,Arrays,Algorithm,Dynamic Programming,Priority Queue,我最近遇到了一个有趣的编码问题,如下所示: 有n个盒子,让我们假设这是一个由n个盒子组成的数组 对于该数组的每个索引i,给出了三个值- 1.)重量(i) 2.)左(i) 3.)对(i) left(i)表示-如果选择了weight[i],则不允许我们从该第i个元素的左侧选择left[i]元素 类似地,right[i]表示如果选择了arr[i],则不允许我们从其右侧选择right[i]元素 示例: 重量[2]=5 左[2]=1 右[2]=3 然后,若我在位置2选取元素,我得到5个单位的重量。但是,我

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

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

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

1.)重量(i)

2.)左(i)

3.)对(i)

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

类似地,
right[i]
表示如果选择了
arr[i]
,则不允许我们从其右侧选择
right[i]
元素

示例

重量[2]=5

左[2]=1

右[2]=3

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

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

样本测试用例:-

**输入:**

五,

203

400

3200

7.2.1

920

**输出:**

十三,

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

我使用动态规划方法(类似于最长递增子序列)来获得
O(n^2)
解。但是,无法想出
O(n*logn)
解决方案<代码>(n最多可为10^5。)

我还尝试使用优先级队列,其中具有较低值
(右[I]+I)
的元素被赋予较高的优先级(在主键值相等的情况下,将较高的优先级分配给具有较低值“I”的元素)。但是,它也给出了超时错误

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

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

  • 在数组中插入数字
  • 找到给定范围内的最大值
  • 我们将使用此数据结构来保持通过选择框i以及左侧框的最佳选择可以实现的最大权重

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

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

    最后一个算法是在i=0..n-1上循环,对于每个i:

  • 通过查找范围0中的最大值来计算框i的结果…(i-左[i])
  • 计划在我们到达位置i+右侧[i]时添加的结果
  • 将任何以前计划的结果添加到我们的数据结构中
  • 最终结果是整个数据结构中的最大值

    总的来说,复杂性是o(nlogn),因为i的每个值都会导致一次查找和一次更新操作。

    一种方法是使用a来创建一个数据结构,使其易于在o(logn)时间内分别执行两次操作:

  • 在数组中插入数字
  • 找到给定范围内的最大值
  • 我们将使用此数据结构来保持通过选择框i以及左侧框的最佳选择可以实现的最大权重

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

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

    最后一个算法是在i=0..n-1上循环,对于每个i:

  • 通过查找范围0中的最大值来计算框i的结果…(i-左[i])
  • 计划在我们到达位置i+右侧[i]时添加的结果
  • 将任何以前计划的结果添加到我们的数据结构中
  • 最终结果是整个数据结构中的最大值


    总的来说,复杂性是o(nlogn),因为i的每个值都会导致一次查找和一次更新操作。

    Re:“但是,它也会导致超时错误”:你能链接到这个问题的来源吗?我发现你的问题描述令人困惑。框?左/右权重?我想如果你能更好地描述这个问题,你可能会解决得更好@雅利安,对不起,我看不出答案是什么13@ShihabShahriar将选择第二个和第五个元素(分别有权重4和9),因为这是在不违反左右约束的情况下我们可以获得的最大权重。@AryanSharma,你能分享问题链接吗?Re:“但是,它也给出了超时错误”:你能链接到这个问题的来源吗?我发现你的问题描述令人困惑。框?左/右权重?我想如果你能更好地描述这个问题,你可能会解决得更好@雅利安,对不起,我看不出答案是什么13@ShihabShahriar将选择第二个和第五个元素(分别有权重4和9),因为这是在不违反左右约束的情况下我们可以获得的最大权重。@AryanSharma,你能分享问题链接吗?