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

时间:2017-11-12 07:50:41

标签: algorithm dynamic-programming

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

n = 4;
A = [1 4 3 2 9 8 7 6]

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

我的想法: 我知道这是一个动态编程问题。但是,我不确定如何从一个较小的问题来考虑它。希望这是有道理的。谢谢!

2 个答案:

答案 0 :(得分:2)

如果所有数字都是非负数,则最好尽可能长地使子序列获得最大总和。区间限制意味着只有n种可能性来选择起始索引。在示例中,您将获得以下四个:

1 9
4 8
3 7
2 6

计算每个的总和并选择最大值。

答案 1 :(得分:0)

您可以通过n 查看元素索引的余数,以将元素的子集中的元素除以另一个元素。然后总结每个子集的所有元素,你可以找到具有更高总和的那个元素。
可以很容易地找到此时的序列(原始数组中的索引,值) 我的意思是这样的(注意缩进)

   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])        

我不确定这是你正在寻找的方法,但也许它可以帮到你。