C 在数组中查找最大可能和的最佳答案是什么

C 在数组中查找最大可能和的最佳答案是什么,c,arrays,algorithm,C,Arrays,Algorithm,问题是: 通过选择元素,使两个元素不相邻,从而找到正整数数组中可能的最大和 有这样一个答案: 但这个问题的最佳答案是什么 让我们用“t”表示数组,并从0开始索引它。设f为a 功能使 f(k)=[0..k]子阵中具有问题条件的最大和。 现在使用动态规划: 提前谢谢 嗯,我认为这已经是最好的答案了。 因为您需要O(n)来读取数据。 O(n)算法是big-O表示法中最快的 您提出的解决方案是 类似方法(第7页): 设m[i]为在元素a[i]处结束的任何子数组的最大和 m[i]只是max(a[i],m[

问题是:

通过选择元素,使两个元素不相邻,从而找到正整数数组中可能的最大和

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

让我们用“t”表示数组,并从0开始索引它。设f为a 功能使 f(k)=[0..k]子阵中具有问题条件的最大和。 现在使用动态规划:


提前谢谢

嗯,我认为这已经是最好的答案了。
因为您需要O(n)来读取数据。
O(n)算法是big-O表示法中最快的

您提出的解决方案是

类似方法(第7页):

m[i]
为在元素
a[i]
处结束的任何子数组的最大和
m[i]
只是
max(a[i],m[i-1]+a[i])

这是
O(n)。

而且你不能得到低于O(n)的任何东西,因为你必须访问数组的每一项至少一次才能计算结果。

公共静态int maxSum(int[]A){
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;
}
返回最大和(A,0,1); } 私有静态int maxSum(int[]A,int x,int y){ int c=0,d=0;
如果(x)上面的算法不是O(n)。今晚我的算法分析不是很强,但上面的算法至少是O(n lg n)或O(n^2)。我不明白你的意思。如果你将f(I)存储在数组f[]中,那么你只需要运行calculate f[1]…f[n]一次。啊,你是对的。别理我。
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;
}