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 整除的子序列总数