Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最大连续子序列_Algorithm - Fatal编程技术网

Algorithm 最大连续子序列

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。我们可以用动态规划来解决这个问题 设

大家好 请帮助完成以下算法

假设我们有序列(负数允许)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
。我们可以用动态规划来解决这个问题

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