不相邻最大子序列和
题目描述
给你一个 n ,和一个长度为 n 的数组,在不同时选位置相邻的两个数的基础上,求该序列的最大子序列和(挑选出的子序列可以为空)。
示例
- 示例1
输入
3,[1,2,3]
返回值
4
说明
有 [], [1], [2], [3], [1,3] 4 种选取方式其中 [1,3] 选取最优,答案为 4 。
- 示例2
输入
4,[4,2,3,5]
返回值
9
说明
其中 [4,5] 的选取方案是在满足不同时选取相邻位置的数的情况下是最优的答案。
解决方案
动态规划
根据题目的描述可以很快明白这是一个 01 背包问题,根据前边已经计算好的前 i 个节点的结果判断是否选择当前节点。
状态转移方程:
dp[i] = Math.max(dp[i-1], dp[i-2]+arr[i-1])
边界条件:
for (int i = 2; i <= n; i++) {}
那么就可以根据这些判断出来的条件撸代码了。
public long subsequence (int n, int[] array) {