java 查找没有相邻元素的子序列的最大总和

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 查找没有相邻元素的子序列的最大总和相关的知识,希望对你有一定的参考价值。

import java.util.*;
public class MaxNonAdjacentSequenceSum {
    public static void main(String args[]) {
        MaxNonAdjacentSequenceSum maxNonAdjacentSequnceSum = new MaxNonAdjacentSequenceSum();
        int[][] input = {
          null,
          {},
          {9},
          {2,1},
          {1,2,9,4,5,0,4,11,6}
        };
        
        for(int i=0; i< input.length; i++) {
            System.out.println("Input: " + Arrays.toString(input[i]) + 
                               " ResultUsingRecur: " + maxNonAdjacentSequnceSum.findUsingRecur(input[i]) +
                               " ResultUsingDP: " + maxNonAdjacentSequnceSum.findUsingDP(input[i]) + 
                               " ResultUsingDPExtraSpace: " + maxNonAdjacentSequnceSum.findUsingDPExtraSpace(input[i]));
        }
    }
    
    private int findUsingRecur(int[] input) {
        if(input == null) return 0;
        return findRecursion(input, 0, Integer.MIN_VALUE);
    }
    
    private int findRecursion(int[] input, int i, int prev) {
        if( i == input.length) {
            return 0;
        }
        int exclude = findRecursion(input, i+1, prev);
        int include = 0;
        if(prev +1 != i ) {
            include = findRecursion(input, i+1, i) + input[i];
        }
        return Math.max(include, exclude);
        //return Math.max(findRecursion(input, i+1, prev),
        //               (prev+1 != i) ? findRecursion(input, i+1, i) + input[i]:0);
    }
    
    private int findUsingDPExtraSpace(int[] input) {
        if(input == null || input.length < 1) return 0;
        if(input.length == 1) return input[0];
        int[] tracker = new int[input.length];
        tracker[0] = input[0];
        tracker[1] = Math.max(input[0], input[1]);
        for(int i=2; i< input.length; i++){
            tracker[i] = Math.max(tracker[i-1], tracker[i-2] + input[i]);
            tracker[i] = Math.max(tracker[i], input[i]);
        }
        
        return tracker[input.length - 1];
    }
    
    private int findUsingDP(int[] input) {
        if (input == null || input.length < 1) return 0;
        if(input.length == 1) return input[0];
        int prevPrev = input[0];
        int prev = Math.max(input[0], input[1]);
        int maxSoFar = 0;
        for(int i=2;i< input.length;i++) {
            int cur = Math.max(input[i], Integer.max(prev, prevPrev + input[i]));
            prevPrev = prev;
            prev = cur;
        }
        return prev;
    }
}

以上是关于java 查找没有相邻元素的子序列的最大总和的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 最大总和使得没有两个元素相邻

LeetCode第[53]题(Java):Maximum Subarray

c_cpp 最大子阵列总和。在具有最大总和的数组(包含至少一个数字)中查找连续的子数组。

c_cpp 从正整数数组中找出子序列的最大总和,其中任意两个子序列彼此不相邻i

非相邻值的最大总和

计算总和可被 k 整除的子序列总数