最近,我遇到了波兰信息奥林匹克竞赛的一项名为“围栏”的任务,但我无法解决。
第一行包含整数n
(1 <= 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
答案 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。 我认为这是正确的解决方案,再次感谢您的提示。