最大总和序列,使得没有两个元素相邻

时间:2018-05-16 16:59:41

标签: algorithm dynamic-programming

我的最大总和的实现在下面,但是我需要序列,它给出了googlestackoverflow上看到的最大值,但是没有输出序列。

public int maxSum(int arr[]) {
     int excl = 0;
     int incl = arr[0];
     for (int i = 1; i < arr.length; i++) {
       int temp = incl;
       incl = Math.max(excl + arr[i], incl);
       excl = temp;
     }
     return incl;
}

因此3 2 7 10应返回(3和10)或3 2 5 10 7应返回(3,5和7)或{5,5,10,100,10,5}将返回(5,100) 5)或{1,20,3}将返回20 我确实想要这个problem解决方案,但我需要的返回值是包含在最大总和而不是最大总和值中的元素序列

2 个答案:

答案 0 :(得分:0)

你的意思是在这个数组:[1,3,4,2,4,7,5,3],计算[1 + 4 + 4 + 5]和[3 + 2 + 7 + 3] 并返回更大的一个?

如果你这样做,这是我的算法:

public int maxSum(int arr[]) {
  int sum1 = 0;
  int sum2 = 0;
  for(int i = 0; i < arr.length; i+=2)
    sum1 += arr[i];
  for(int i = 1; i < arr.length; i+=2)
    sum2 += arr[i];

  return Math.max(sum1, sum2);
}

或者这个:

public int maxSum(int arr[]) {
  int sum1 = 0;
  int sum2 = 0;
  for(int i = 0; i < arr.length; i+=2)
    sum1 += arr[i];
    try {sum2 += arr[i + 1];} catch(ArrayIndexOutOfBoundsException e){}
  }
  return Math.max(sum1, sum2);
}

答案 1 :(得分:0)

看起来类似于最长增加碎片问题(自上而下方法)。 您可以返回它的总和,而不是具有序列的长度。另外,不要跳过一个,而是跳过两个以避免相邻的元素。