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 每隔n个间隔从数组中查找子序列_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm 每隔n个间隔从数组中查找子序列

Algorithm 每隔n个间隔从数组中查找子序列,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我想在一个数字列表中找到序列,它返回最大和。限制条件是它必须每隔n个间隔。例如: n=4 A=[14329876] 因此,位置1和5处的最佳子序列为4+8=12(我们假设位置编号从0开始) 我的想法是: 我知道这是一个动态规划问题。然而,我不知道如何从一个小问题的角度来考虑它。希望这是有意义的。谢谢 如果所有数字都是非负的,最好使子序列尽可能长,以获得最大和。间隔限制意味着,只有n可以选择起始索引。在本例中,您可以得到以下四点: 1 9 4 8 3 7 2 6 计算每个元素的总和并选择最大值。

我想在一个数字列表中找到序列,它返回最大和。限制条件是它必须每隔n个间隔。例如:

n=4
A=[14329876]

因此,位置1和5处的最佳子序列为4+8=12(我们假设位置编号从0开始)

我的想法是:
我知道这是一个动态规划问题。然而,我不知道如何从一个小问题的角度来考虑它。希望这是有意义的。谢谢

如果所有数字都是非负的,最好使子序列尽可能长,以获得最大和。间隔限制意味着,只有
n
可以选择起始索引。在本例中,您可以得到以下四点:

1 9
4 8
3 7
2 6
计算每个元素的总和并选择最大值。

您可以将元素索引的剩余部分除以n,将元素子集中的元素从一个元素除以另一个元素。然后对每个子集的所有元素求和,就可以找到总和较高的元素
此时的序列(原始数组中的索引、值)很容易找到。
我的意思是这样的(注意缩进处)

n=区间长度;
组[n]=[]
和[n]=[0,…,0];
对于i=0,…,数组长度-1
k=i%n;
在[k]组中插入数组的第i个元素;
对于j=0,…,n-1
总和[j]=组[j]中所有元素的总和;
max=0;
对于k=0,…,n-2

如果(总和[k]这不只是找到
n
可能的子序列中的最大值的问题吗?似乎很容易。或者数组中允许负数吗?在这种情况下,它会变得稍微困难一些。@Henry我不确定你的意思。这个问题要求你,如果你选择索引I,你只能对I,I+4,I+8处的值求和……所以同样,负数字是不被考虑的。问题是你蛮力你的解决方案。我想通过一个动态编程的方式来解决它。当我们考虑一个小数组时,时间复杂度不是很差,但是如果我们讨论的是一个100万个数的数组,其中n=2,那么该解就变得更难计算。你必须至少看一次每个数字。我在这里做的是,只看一次每个数字。这是你能达到的最好成绩。一百万个数字和区间2意味着你必须用每个50万个数字计算两个和。这有什么困难?我明白了。我不确定动态规划是否是一个更好的方法,或者是否有更好的方法甚至是一开始。我最初想到了这个解决方案,但不相信它在时间复杂度方面是有效的。谢谢!动态规划只在使用它可以避免重复重新计算子问题的情况下才有用。这里不是这种情况。
   n=lenght of the inteval;
   group[n]=[]
   sum[n]=[0,....,0];
   for i=0,...,array.lenght-1
      k=i%n;
      insert the i-th element of the array in group[k];
   for j=0,...,n-1
      sum[j]=sum of all element in group[j];
   max=0;
   for k=0,...,n-2
      if(sum[k]<sum[k+1])
        max=k+1;
   for u=0,...,group[max].lenght
      index=u*max;
      print (index, group[max][u])