Algorithm 最大连续子序列
大家好 请帮助完成以下算法 假设我们有序列(负数允许)4,3,-2,13,11,1,1,8,5我需要找到 成员之间最大和的子序列,以及成员之间的距离在原始序列中至少应为4。 根据示例,子序列为(13,8)=21 感谢您的帮助。如果没有“至少k个元素”部分,这是一个经典问题:www.codemanic.com/mathnotes/papers/maxsum/maxsum.pdf编辑: 因此,您希望最大和子序列使得所选子序列中的任意两个元素Algorithm 最大连续子序列,algorithm,Algorithm,大家好 请帮助完成以下算法 假设我们有序列(负数允许)4,3,-2,13,11,1,1,8,5我需要找到 成员之间最大和的子序列,以及成员之间的距离在原始序列中至少应为4。 根据示例,子序列为(13,8)=21 感谢您的帮助。如果没有“至少k个元素”部分,这是一个经典问题:www.codemanic.com/mathnotes/papers/maxsum/maxsum.pdf编辑: 因此,您希望最大和子序列使得所选子序列中的任意两个元素i和j具有j-i>=4。我们可以用动态规划来解决这个问题 设
i
和j
具有j-i>=4
。我们可以用动态规划来解决这个问题
设a
为给定数组
设m[i]=所需属性在位置i处结束的最大和子序列
如果我们有
1 2 3 4 5 6 7 8 9
a = 4, 3, -2, 13, 11, 1, 1, 8, 5
然后
一般来说,我们有m[i]=max{max(m[j]+a[i],a[i]),j=1到i-4}
这将是O(n^2)
。您可以很容易地从中获得O(n)
解决方案。请注意,在上述循环中选择最大值m[j]
总是有帮助的。因此,在遍历时计算m
的最大值,如以下伪代码所示:
maxm = -inf
for i = 1 to a.Length do
m[i] = a[i]
if (i >= 4 + 1)
if (m[i - 4] > maxm)
maxm = m[i - 4]
m[i] = max(m[i], maxm + a[i])
output the maximum value in `m`.
您可以轻松地将其推广到k
,而不是4
这不是你想要的,但我还是要离开它,因为我认为这是一个经典问题的有趣变体 如果您确实在寻找长度至少为
k
的最大和子序列,那么此算法将在O(n)
中解决该问题:
让a
成为您的数字数组。
设s[i]=s[i-1]+a[i]
。这是一个称为前缀和数组的数组。我们可以用它来求任意序列的和,就像这样:sum[i,j]=s[j]-s[i-1]
因此,对于每个i>=k
,我们需要一个j max)
max=s[i]-min
我知道你不是以英语为母语的人,但你的问题很难理解。也许你可以试试。此外,你应该提出具体的疑问,不要指望有人为你工作。人们是来帮助你的,不是来做你的家庭作业的。你的问题很难理解。请编辑以使其有意义。如果你能用母语清楚地表达你的问题,这里很有可能有人可以编辑你的文章,使其在英语中有意义。我认为他想要包含至少k
元素的最大和子序列。不过我不确定。在本例中,k
为4@马可-这就是你认为的问题所在,而不是问题所在。在OP澄清之前,请不要编辑,你完全改变了哪怕是一点都不清楚的内容。我希望我理解正确(!),但我已将问题编辑得更有意义。谢谢你的评论,实际上这不是同一个问题。@Leo请澄清你的问题。谢谢你的回答。子序列的长度可能是任意长度,假设子序列中的第一个成员具有1(第一)个位置,则下一个成员在原始序列中必须具有1+k个位置。在示例子序列(13,8)中,k>4,我们的第一个成员是13,位置为4,8,位置为9,我希望这将有助于理解这个问题。我试图用矩阵数组来解决这个问题,其中每一行都包含最好的成员位置,但我被卡住了…@狮子座-我已经更新了我的帖子,请重新阅读,看看当前的解决方案是否符合你的需要,我认为这解决了你的问题。这是一个哲学问题,并不比生命的意义简单。但好的解决方案是+1。
maxm = -inf
for i = 1 to a.Length do
m[i] = a[i]
if (i >= 4 + 1)
if (m[i - 4] > maxm)
maxm = m[i - 4]
m[i] = max(m[i], maxm + a[i])
output the maximum value in `m`.
s[0] = 0
for i = 1 to a.Length do
s[i] = s[i - 1] + a[i]
max = -inf
min = inf
for i = k to a.Length do
if (s[i - k] < min)
min = s[i - k]
if (s[i] - min > max)
max = s[i] - min