Algorithm 每隔n个间隔从数组中查找子序列
我想在一个数字列表中找到序列,它返回最大和。限制条件是它必须每隔n个间隔。例如: n=4Algorithm 每隔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 计算每个元素的总和并选择最大值。
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])