给你一个数组,其长度为 n ,在其中选出一个子序列,子序列中任意两个数不能有相邻的下标(子序列可以为空),求该序列的最大子序列和。
本题中子序列指在数组中任意挑选若干个数组成的数组。
数据范围:
,数组中所有数的值满足
进阶:空间复杂度
, 时间复杂度
3,[1,2,3]
4
有[],[1],[2],[3],[1,3] 4种选取方式其中[1,3]选取最优,答案为4
4,[4,2,3,5]
9
其中[4,5]的选取方案是在满足不同时选取相邻位置的数的情况下是最优的答案
1,[-1]
0
选择子序列为空最优
5,[3,2,3,4,5]
11
其中选择[3,3,5]的方案是最优的答案
输入的值在int范围内
class Solution: def subsequence(self , n , array ): # 类似"打家劫舍"问题:相邻位置不能同时偷 # dp[i]定义为数组中前i个数据的最大子序列和 dp = [0] * (n+1) # basecase 0/1个数最大和就是0/array[0] dp[1] = array[0] # 状态转移 for i in range(2,n+1): # 面对第i个数,选择 偷 或者 不偷 # 不偷:等同于dp[i-1] # 偷:前i-2个数据的序列和加第i个数据 dp[i] = max(dp[i-1], dp[i-2] + array[i-1]) # 返回数组中前n个数据的最大序列和 return dp[n]