消除最大子阵列

时间:2012-12-31 10:16:22

标签: algorithm arrays

我知道如何在O(n)中找到数组的最大连续子数组。 但是,以下链接中的第二个问题要求在可以消除某些元素(k)时找到最大的连续子数组: http://www.iarcs.org.in/inoi/2011/inoi2011/inoi2011-qpaper.pdf 我似乎无法找到一种有效的方法。

2 个答案:

答案 0 :(得分:2)

考虑到我认为做O(N ^ 2)解决方案的限制。我不会告诉你如何解决问题,但会给你一些提示:

  1. 请注意,这些数字的值非常有限 - 它们可能只在[-10 ^ 4,10 ^ 4]范围内,因此可以使用一个数组来计算给定值的数量(在整个数组中或仅在给定的时间间隔内)
  2. 迭代您将选择的子阵列的长度并以线性时间解决每个长度的问题
  3. 请注意,对于给定的数组,如果它们小于k,则总是丢弃最小的k值或子阵列中的所有负数
  4. 希望这可以帮助您解决问题。

答案 1 :(得分:1)

有一个O(N.K)动态编程解决方案:

d[i][j](0 <= i&lt; = N,0&lt; = j&lt; = K)是任何(可能为空的)子数组结尾的最大总和通过消除i元素,使用j元素。

初始值: d[0][j] = 0代表0&lt; = j&lt; = K

更新动态值:

for i = 1 to N:
     d[i][0] = max (d[i-1][0]+a[i], 0)
     for j = 1 to K:
         d[i][j] = max(d[i-1][j]+a[i], d[i-1][j-1])
对于0&lt; = max{d[N][j]}&lt; = K

和解决方案为j