我在论坛上找到了一些解决该问题的方法,但是似乎都没有帮助。主要是因为我找到了一个解决方案,但不知道它如何以及为什么起作用。
问题指出:对于给定的正整数数组,找到不相邻元素的最大和。
该问题还严格指出,解必须在线性时间内。这是我发现的东西:
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);
有人可以帮助澄清这个解决方案吗?
答案 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))
。
您发布的代码是迭代的。可以轻松地以递归形式重写它。玩得开心!