栅栏-波兰信息奥林匹克大会的任务

时间:2019-02-05 11:15:38

标签: algorithm

最近,我遇到了波兰信息奥林匹克竞赛的一项名为“围栏”的任务,但我无法解决。

第一行包含整数n1 <= n <= 200 000),第二行包含n个数字(每个数字不少于1且不大于{{ 1}})。您必须删除一些数字,以使剩余的数字之和尽可能大,并且其值必须增加和减少。我的意思是,如果10^6是一组剩余数字,而A是集合中第ai个数字,则i等或a1 < a2 > a3 < a4 > a5 < a6等。

a1 > a2 < a3 > a4 < a5 > a6值的范围来看,解决方案的复杂度似乎与n相似,但是我不确定。如果有人告诉我解决方案,我将不胜感激。

一些示例

输入:

  

2
  100 90

输出:

  

190

输入:

  

6
  7 5 4 6 6 5

输出:

  

23

1 个答案:

答案 0 :(得分:0)

谢谢!最后我想出了一个解决方案。

我将创建两个数组(假设dp_bigger和dp_smaller),第一个用于最大和的数组以第i个元素(当i大于先前包含的元素时)结束,而第二个在第i个元素小于先前的元素时结束包含元素。为了计算dp_bigger [i],我计算了arr [i]的和(arr是一个数组,其中的所有数字都来自输入),并且从dp_smaller先前计算出的最大和是在某个索引j处(0 <= j

当然,我必须记住,当我计算dp_bigger [i]时,我发现一些dp_smaller [j]具有最大和,我必须检查arr [i]> arr [j]。我对dp_smaller做相同的操作,但检查了arr [i]

现在,如果我想快速找到这些最大值,我将创建另外两个数组(分别称为大和小),每个数组都填充有零,大小均为10 ^ 6。当我在large [arr [i] -1]中计算一些dp_bigger [i]时,我将dp_bigger [i]放在dp_smaller [i]中,这样我就可以在越来越大的数组上创建范围树。因此,当我想计算dp_bigger [i]时,我会在范围从0到arr [i] -2的较小数组中搜索max,如果我想计算dp_smaller的情况下,我会在arr [i]到10 ^范围内搜索较大数组。 6。

我认为这是正确的解决方案,再次感谢您的提示。