[算法]數組中求出下標不連續的任意個數,使得和最大


給定一個數組,可以從數組中取出下標不連續的任意個數,求可以取出的數的和的最大值,例如:給出數組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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM