不相邻值的最大和

时间:2018-11-15 08:02:28

标签: algorithm

我在论坛上找到了一些解决该问题的方法,但是似乎都没有帮助。主要是因为我找到了一个解决方案,但不知道它如何以及为什么起作用。

问题指出:对于给定的正整数数组,找到不相邻元素的最大和。

该问题还严格指出,解必须在线性时间内。这是我发现的东西:

int max1 = 0 
int max2 = a[0];

int i;
for(i = 1; i<n; i++){
    int new_max1 = max(max2, max1);
    max2 = max1 + a[i];
    max1 = new_max1;
}
return max(max1, max2);

有人可以帮助澄清这个解决方案吗?

2 个答案:

答案 0 :(得分:0)

这是一个DynamicProgramming /递归解决方案,它基本上在每个位置查看2个场景,无论是包含还是排除一个值。 由于数组中的所有值都将为正,因此该解决方案有效。 如果数组包含负值,则此解决方案将不起作用。

arr = Array of numbers
af = function(currentIndex, cummulativeSum){
 if (currentIndex >= arr.length) return cummulativeSum

return Math.max(af(currentIndex+2,cummulativeSum+arr[currentIndex]), af(currentIndex+1, cummulativeSum))
}

答案 1 :(得分:0)

请考虑以下几个问题:

P1i :找到包含第i个元素的Array[0:i+1]的不相邻元素的最大和。
P2i :找出Array[0:i+1]中不包含第i个元素的不相邻元素的最大和。

其中Array[i,j]Array的子集,范围从第i个到第(j-1)个。

根据{P1(i+1), P2(i+1)}来思考如何解决{P1i, P2i}

您完成了!

更明确地:

基本情况(i = 0)为{Array[0], i}

然后对于i = 1,P11, P21的解决方案是{(Array[1] + P10), P20}

然后对于i = 2,P12, P22的解决方案是{(Array[2] + P21), P11}

然后对于i = 3,P13, P23的解决方案是{(Array[3] + P22), P12}

然后对于i = 4,P14, P24的解决方案是{(Array[3] + P23), P13}

...

您正在寻找的解决方案是max(P1(n-1), P2(n-1))

您发布的代码是迭代的。可以轻松地以递归形式重写它。玩得开心!