给定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
答案 0 :(得分:1)
Dynamic programming是你的朋友:
假设我们可以选择S[i][j]
个数字,i
表示只考虑前j
个数字时可以获得的最大总和。
然后:
S[i][j] = S[i - 1][j]
,如果i
不在细分中。S[i][j] = S[i - k][j - k] + value_of_segment(i - k + 1, i)
,如果i
位于k
段的长度中。我们让S[i][j] = max((1), (2))
。
value_of_segment
可以在O(n)
预先计算。
S[i][j]
可以在O(N * T^2)
中计算出来。