找到数组中可能的最大总和的最佳答案是什么?

时间:2012-04-09 09:05:46

标签: c arrays algorithm

问题是:

通过选择元素来找到正整数数组中可能的最大总和,使得两个元素彼此不相邻。

有一个这样的答案: 但这个问题的最佳答案是什么

  

让我们用“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).

提前致谢。

3 个答案:

答案 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;
}