给一个数组,在这个数组中选组合,不能选相邻的数,问哪种组合累加和最大?
dp[i] : arr[0 ~ i] 的所有组合中最大的累加和
- 1) 只包括arr[ i ]
- 2) 完全不要arr[ i ],———> dp[i - 1]
3) arr[ i ] + dp[i - 2]
技巧:凡是子数组问题就想以每个位置i结尾求一遍,
- 但是这种子序列,组合这种不连续的,你就可以从 0 ~i 范围这个角度入手
public static int maxSum(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int N = arr.length;if (N == 1) {return arr[0];}if (N == 2) {return Math.max(arr[0], arr[1]);}int[] dp = new int[N];dp[0] = arr[0];dp[1] = Math.max(arr[0], arr[1]);for (int i = 2; i < N; i++) {int p1 = arr[i];int p2 = dp[i - 1];int p3 = arr[i] + dp[i - 2];dp[i] = Math.max(Math.max(p1, p2), p3);}return dp[N - 1];}
