题目描述
给你一个n,和一个长度为n的数组,在不同时选位置相邻的两个数的基础上,求该序列的最大子序列和(挑选出的子序列可以为空)。
输入 3,[1,2,3] 返回值 4 说明:有[],[1],[2],[3],[1,3] 4种选取方式其中[1,3]选取最优,答案为4
输入 4,[4,2,3,5] 返回值 9 说明:其中[4,5]的选取方案是在满足不同时选取相邻位置的数的情况下是最优的答案
主要思路:
新建整数数组dp,该数组的第i个元素(下标为i-1)表示数组array的前i项的不相邻子序列的最大和;
显然,dp[0] 的值是array[0];dp[1]的值是dp[0]和array[1]的最大值;
所以,如果前n项最大值为a,则第n+1项最大值就是Math.max(a,前n-1项最大值+第n+1项的值)
即dp[n] = Math.max( dp[n-1],dp[n-2]+array[n] );
import java.util.*;
public class Solution {
public long subsequence (int n, int[] array) {
int[] dp = new int[n];
dp[0] = array[0];
dp[1] = Math.max(dp[0],array[1]);
for(int i=2;i<n;i++){
dp[i] = Math.max(dp[i-2]+array[i],dp[i-1]);
}
return dp[n-1];
}
}