题解 | #不相邻最大子序列和#

不相邻最大子序列和

http://www.nowcoder.com/practice/269b4dbd74e540aabd3aa9438208ed8d

Python2 解题

令 dp[i]=[a ,b]
a 表示是否使用第i个数字
b 表示前i个数组成的序列的最大和

动态规划的每一步需要分类讨论
如果dp[i-1]没有使用第i-1个数字(dp[i-1][0]==False),则看 dp[i-1], dp[i-1]+array[i], array[i] 哪个大
如果dp[i-1]使用了第i-1个数字(dp[i-1][0]==True),则看 dp[i-1], dp[i-2]+array[i], array[i] 哪个大

因为我们关心最大子序列的和,而dp[i] >= dp[i-1],因此其实不需要dp数组,我们只需要关注dp[i-2],dp[i-1]即可得到dp[i],即前i个数组形成的不相邻最大子序列和

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 计算
# @param n int整型 数组的长度
# @param array int整型一维数组 长度为n的数组
# @return long长整型
#
# dp[i] = [a ,b] b表示前i个数组成的序列的最大和, a表示是否使用第i个数字
# dp[i] = if dp[i-1][0]: max(dp[i-1], dp[i-2]+array[i], array[i])
#         else: max(dp[i-1], dp[i-1]+array[i], array[i])

class Solution:
    def subsequence(self , n , array ):
        # write code here
        if n <= 2:
            return max(array)

        dp1 = [True, array[0]]
        dp2_isused = False if array[0] >= array[1] else True
        dp2_sum = max(array[0], array[1])
        dp2 = [dp2_isused, dp2_sum]

        for i in range(2, len(array)):
            tmp_dp = []
            if dp2[0]:
                if dp2[1] >= dp1[1]+array[i] and dp2[1] >= array[i]:
                    tmp_dp = [False, dp2[1]]
                else:
                    tmp_dp = [True, max(dp2[1], dp1[1]+array[i], array[i])]
            else:
                if array[i] > 0:
                    tmp_dp = [True, max(dp2[1] + array[i], array[i])]
                else:
                    tmp_dp = [False, max(dp2[1], dp2[1] + array[i], array[i])]

            dp1 = dp2
            dp2 = tmp_dp

        return dp2[1]
全部评论

相关推荐

02-16 22:13
门头沟学院 Java
Yki_:女生学成这样挺不错了,现在停止网课,立刻all in八股,从最频繁的开始背,遇到不会的知识点直接问AI,项目也别手敲,直接看技术文档,背别人总结好的面试官可能问的问题的答案,遇到不会的再去代码里找具体实现就可以了,3月份开始边背边投实习约面
点赞 评论 收藏
分享
头像
02-15 16:23
中南大学 Java
野猪不是猪🐗:签了美团真是不一样! 亲戚们都知道我签了美团,过年都围着我问送一单多少钱,还让弟弟妹妹们引以为戒,笑我爸我妈养了个🐢孩子,说从小就知道我这个人以后肯定没出息,我被骂的都快上天了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务