题目描述
给你一个n($1\leq n\leq10^5$),和一个长度为n的数组,在不同时选位置相邻的两个数的基础上,求该序列的最大子序列和(挑选出的子序列可以为空)。
示例1
输入
1 | 3,[1,2,3] |
返回值
1 | 4 |
说明
1 | 有[],[1],[2],[3],[1,3] 4种选取方式其中[1,3]选取最优,答案为4 |
示例2
输入
1 | 4,[4,2,3,5] |
返回值
1 | 9 |
说明
1 | 其中[4,5]的选取方案是在满足不同时选取相邻位置的数的情况下是最优的答案 |
备注:
1 | 输入的值在int范围内 |
题目意思
类似于小偷问题,不能偷相邻位置的元素
一维动态规划
学习类似于数学归纳法的思想考虑初始条件:
当数组中只有一个元素时,最大收益是偷这一个
当数组中有两个元素时,最大收益是偷两个中的最大值
当数组中有大于两个元素时,最大收益是
dp[i] = Math.max(dp[i-1],dp[i-2]+array[i])
1 | import java.util.*; |
二维动态规划
1 | import java.util.*; |