带负数的最大段总和

时间:2013-03-20 21:28:13

标签: algorithm dynamic numbers intervals

给定N个数字(正数和负数),T =您可以选择的数字数量,如何计算最大间隔总和?间隔中的第一个数字被视为0。

例如: N = 5 T = 4且{3 9 1 1 7} 最大总和是从(3,9)和(1,7)的16!记住3和1被认为是0,因为它们是它们间隔中的第一个数字。 我想出了一个解决方案,但是当我添加负数时,它会变得混乱。 N = 4 T = 3且{-2 1 -3 -4} 解为1(-2,1)和(-3 -3)(当使用负数时,可以考虑由相同负数(-3 -3)= 0形成的区间)。 有什么想法吗?

* LATER EDIT:我的代码出了什么问题? http://pastebin.com/QTTTrvUz

1 个答案:

答案 0 :(得分:1)

Dynamic programming是你的朋友:

假设我们可以选择S[i][j]个数字,i表示只考虑前j个数字时可以获得的最大总和。

然后:

  1. S[i][j] = S[i - 1][j],如果i不在细分中。
  2. S[i][j] = S[i - k][j - k] + value_of_segment(i - k + 1, i),如果i位于k段的长度中。
  3. 我们让S[i][j] = max((1), (2))

    value_of_segment可以在O(n)预先计算。

    S[i][j]可以在O(N * T^2)中计算出来。