题目描述
给你一个n(1≤n≤105),和一个长度为n的数组,在不同时选位置相邻的两个数的基础上,求该序列的最大子序列和(挑选出的子序列可以为空)。
示例1
输入 3,[1,2,3]
返回值 4
说明有[],[1],[2],[3],[1,3] 4种选取方式其中[1,3]选取最优,答案为4
该题目与打家劫舍性质类似。用dp[i] 来表示数组长度为i 时所构成的最大子序列和。
dp[ i ] 由两部分组成,一部分是选择arr[i],那么意味着不能选取arr[i-1] ,只能选择dp[i-2],另一部分是不选择arr[i],意味着只能等于dp[i-1] 。
class Solution {
public:
long long subsequence(int n, vector<int>& array) {
// write code here
vector<int> dp(n,0);
dp[0]=array[0];
dp[1]=max(array[0],array[1]);
for(int i=2;i<n;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+array[i]);
}
return dp[n-1];
}
};