所以我在不使用 DP 的情况下用 Java 实现了一个解决方案;我只是使用了递归。我会试着解释一下。
首先,我们要找到一个基本情况:
- 如果数组长度 == 1,则 sum(array) = array[0]
- 另外,如果数组长度 == 2,那么 sum(array) = max(array[0],array[1])
现在,让我们来看看array.length = n 的一般情况。我们必须决定 array[n-1] 是否是解决方案的一部分;也就是说,如果对前 n-1 个元素启动的 sum 小于对前 n-2 个元素 + 第 n 个元素启动的 sum。
简而言之,我们的意思是“考虑第 n 个元素还是它的邻居 (nth-1) 更好?”事实上,我们不能同时考虑两者,因此我们必须选择一个。
private static int sum (int[] array) {
return aux (array,array.length);
}
private static int aux (int[] array, int upTo) {
if (upTo == 1)
return array[0];
else if (upTo == 2)
return (array[1] > array[0])
? array[1] : array[0];
else {
int tmpMax1 = aux (array,upTo-1);
int tmpMax2 = aux (array,upTo-2) + array[upTo-1];
return (tmpMax2 > tmpMax1)
? tmpMax2 : tmpMax1;
}
}
public static void main(String[] args) {
//just a bunch of simple tests. Too lazy to use JUnit
System.out.println(sum(new int[]{2}) + " = 2");
System.out.println(sum(new int[]{2, 5}) + " = 5");
System.out.println(sum(new int[]{2, 5, 2}) + " = 5");
System.out.println(sum(new int[]{3, 10, 2, 4, 10}) + " = 20");
System.out.println(sum(new int[]{10, 12, 5, 2}) + " = 15");
System.out.println(sum(new int[]{10, 12, 5, 2,100}) + " = 115");
System.out.println(sum(new int[]{10, 10, 10, 10,100}) + " = 120");
}