描述
给你一个n(1\leq n\leq10^51≤n≤10 5),和一个长度为n的数组,在不同时选位置相邻的两个数的基础上,求该序列的最大子序列和(挑选出的子序列可以为空)。
分析
- 当元素取2147483647时,加几次就超出int的范围,因此建立long型数组。
- 当全部元素是负值,结果应该返回0,当有一个整数时,应该返回这个正数,因此建立的数组应该包含0,保证最差也不会低于0,以及不会使正数受负数影响变小。
import java.util.*;
public class Solution {
public long subsequence (int n, int[] array) {
if(n == 0){
return 0;
}
if(n == 1){
if(array[0] < 0){
return 0;
}
return array[0];
}
long[] dp = new long[n+1];
dp[0] = 0;
dp[1] = Math.max(0,array[0]);
for(int i = 2; i < n + 1; i++){
dp[i] = Math.max(dp[i-1],dp[i-2] + array[i-1]);
}
return dp[n];
}
}