[算法]数组中求出下标不连续的任意个数,使得和最大

给定一个数组,可以从数组中取出下标不连续的任意个数,求可以取出的数的和的最大值,例如:给出数组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);
    }
原文地址:https://www.cnblogs.com/DarrenChan/p/9657649.html