我有这个问题:
给定一个数组
A
和一个整数K
,将A
划分为K
个连续的子数组,以使每个子数组的求反数之和最大化。 (“反转”是一对索引i
,j
,其中i < j
和A[i] > A[j]
。)返回总和。
例如,如果
A = 9 1 7 2 3
和K = 2
,则答案为4
,因为您可以将数组分为9 1 7 2
(具有四个反转)和{{ 1}}(没有)和4 + 0 = 4。内容
3
我的想法:
这似乎是一个动态编程问题,但我不知道如何将1 <= A.size <= 500
1 <= k <= A.size
1 <= A[i] <= 100000
组集成到解决方案中。
此问题大致转化为找到K
个组,每个组中该组中增加元素的数量最多。
关于如何解决此问题的任何想法都会有所帮助。
答案 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]
的元素数量,我们已经预先计算的。