Arrays 在数组中左右索引上给定约束的情况下,使权重之和最大化
我最近遇到了一个有趣的编码问题,如下所示: 有n个盒子,让我们假设这是一个由n个盒子组成的数组 对于该数组的每个索引i,给出了三个值- 1.)重量(i) 2.)左(i) 3.)对(i)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个单位的重量。但是,我
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)时间内轻松完成两个操作:
总的来说,复杂性是o(nlogn),因为i的每个值都会导致一次查找和一次更新操作。Re:“但是,它也会导致超时错误”:你能链接到这个问题的来源吗?我发现你的问题描述令人困惑。框?左/右权重?我想如果你能更好地描述这个问题,你可能会解决得更好@雅利安,对不起,我看不出答案是什么13@ShihabShahriar将选择第二个和第五个元素(分别有权重4和9),因为这是在不违反左右约束的情况下我们可以获得的最大权重。@AryanSharma,你能分享问题链接吗?Re:“但是,它也给出了超时错误”:你能链接到这个问题的来源吗?我发现你的问题描述令人困惑。框?左/右权重?我想如果你能更好地描述这个问题,你可能会解决得更好@雅利安,对不起,我看不出答案是什么13@ShihabShahriar将选择第二个和第五个元素(分别有权重4和9),因为这是在不违反左右约束的情况下我们可以获得的最大权重。@AryanSharma,你能分享问题链接吗?