给定一个数组,可以从数组中取出下标不连续的任意个数,求可以取出的数的和的最大值,例如:给出数组A[]={1,2,2,5,3,4,3}可以取出的最大和为2+5+4=11。现再给定数组{3,9,7,5,1,3,1,2,7},能取出的数的和的最大值是24。
方法一:动态规划
假设原数组为arr,辅助数组为data. 则data[0] = arr[0], data[i] = max{arr[0], arr[1]}.
i>=2时, data[i] = Max{data[i-1], data[i-2]+arr[i]}
data[i]表示以子数组arr[0..i]符合条件的最大值。
public static int getMaxValue(int[] arr){ int[] data = new int[arr.length]; data[0] = arr[0]; data[1] = Math.max(arr[0], arr[1]); for (int i = 2; i < arr.length; i++) { int val = arr[i]; data[i] = Math.max(data[i - 1], data[i - 2] + val); } return data[data.length - 1]; }
方法二:非动态规划
public static int getMaxValue2(int[] arr) { int sum1 = 0, sum2 = 0; for(int i = 0; i < arr.length; i++){ if(i % 2==0){ sum1 = Math.max(sum2, sum1 + arr[i]); }else{ sum2 = Math.max(sum1, sum2 + arr[i]); } } return Math.max(sum1,sum2); }