首页 > 试题广场 >

不相邻最大子序列和

[编程题]不相邻最大子序列和
  • 热度指数:13301 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给你一个数组,其长度为 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]的选取方案是在满足不同时选取相邻位置的数的情况下是最优的答案    
示例3

输入

1,[-1]

输出

0

说明

选择子序列为空最优  
示例4

输入

5,[3,2,3,4,5]

输出

11

说明

其中选择[3,3,5]的方案是最优的答案  

备注:
输入的值在int范围内
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 计算
# @param n int整型 数组的长度
# @param array int整型一维数组 长度为n的数组
# @return long长整型
# 打家劫舍
class Solution:
    def subsequence(self , n , array ):
        # write code here
        if not n:
            return 0
        if n <= 2:
            return max(max(array), 0)
        dp = []
        dp.append(max(array[0], 0))
        dp.append(max(max(array[:2]), 0))
        for i in range(2, len(array)):
            dp.append(max(dp[i-1], dp[i-2]+array[i]))
        return dp[-1]
    

发表于 2021-08-07 13:09:19 回复(0)
class Solution:
    def subsequence(self , n , array ):
        su, s = [ 0 ] * n, [ 0 ] * n
        if array[0] > 0: s[0] = array[0]
        ans = max(0, s[0])
        for i in range(1, n):
          su[i] = max(su[i-1], s[i-1])
          s[i] = max(su[i-1], su[i-1] + array[i])
          ans = max(ans, su[i], s[i])
        return ans

发表于 2021-07-03 10:29:41 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 计算
# @param n int整型 数组的长度
# @param array int整型一维数组 长度为n的数组
# @return long长整型
#
class Solution:
    def subsequence(self , n , array ):
        # write code here
        if n == 1:
            return array[0]
        output = []
        output.append(0)
        output.append(array[0])
        for i in range(1, len(array)):
            output.append(max(output[i], output[i-1]+array[i]))
        return output[-1]
发表于 2021-04-20 11:51:29 回复(0)

问题信息

难度:
3条回答 3902浏览

热门推荐

通过挑战的用户