计算k个子数组的最大反转

时间:2018-12-16 07:50:25

标签: arrays algorithm dynamic-programming

我有这个问题:

  

给定一个数组A和一个整数K,将A划分为K个连续的子数组,以使每个子数组的求反数之和最大化。 (“反转”是一对索引ij,其中i < jA[i] > A[j]。)

     

返回总和。

     

例如,如果A = 9 1 7 2 3K = 2,则答案为4,因为您可以将数组分为9 1 7 2(具有四个反转)和{{ 1}}(没有)和4 + 0 = 4。

     

内容

3

我的想法:

  • 这似乎是一个动态编程问题,但我不知道如何将1 <= A.size <= 500 1 <= k <= A.size 1 <= A[i] <= 100000 组集成到解决方案中。

  • 此问题大致转化为找到K个组,每个组中该组中增加元素的数量最多。

关于如何解决此问题的任何想法都会有所帮助。

1 个答案:

答案 0 :(得分:2)

我们至少可以有一个O(n^2 * k)动态程序。令f(i, k)代表最多i组的索引k的反转。然后:

f(i, k) = max(
  inversion_count(j, i) + f(j - 1, k - 1)
)
for k <= j <= i

我们可以使用inversion_count(interval)的时间和空间来预先计算得出O(1) O(n^2)时间的结果的步骤:对于{{1}中的所有元素e },存储从A开始的每个间隔中有多少个较小的元素。当我们在主迭代中减少e并增加间隔的大小时,在间隔j中反演的数量增加了小于A[j]的元素数量,我们已经预先计算的。