问题是:
通过选择元素来找到正整数数组中可能的最大总和,使得两个元素彼此不相邻。
有一个这样的答案: 但这个问题的最佳答案是什么
让我们用“t”表示数组,并从0开始索引。设f为a 这样的功能 f(k)= [0..k]子阵列中的最大和与问题的条件。 现在使用动态编程:
f(0) = t[0]
f(1) = max{ t[0], t[1] }
f(k) = max{ f(k-2) + t[k], f(k-1) } if k >= 2
If the array has n elements we need f(n-1).
提前致谢。
答案 0 :(得分:2)
嗯,我认为这已经是最好的答案了 因为你需要O(n)来读入数据 O(n)算法是big-O表示法中最快的算法。
答案 1 :(得分:2)
您建议的解决方案是good one。
类似方法(第7页here):
让m[i]
为任何以元素a[i]
结尾的子数组的最大总和。然后
m[i]
只是max(a[i], m[i-1]+a[i])
。
这是O(n).
并且您无法获得O(n)
以下的任何内容,因为您必须至少访问一次数组中的每个项目以计算结果。
答案 2 :(得分:0)
public static int maxSum(int[] A){
return maxSum(A,0,1);
}
private static int maxSum(int[] A, int x, int y){
int c =0, d=0;
if(x<A.length){
c = A[x]+maxSum(A,x+2,x+3);
}
if(y<A.length){
d = A[y]+maxSum(A,y+2,y+3);
}
return c>d?c:d;
}