题解 | 打家劫舍(二)

打家劫舍(二)

https://www.nowcoder.com/practice/6a8b2ceb3f8f4e5891939d7d7cbbd2c4

def rob(nums):
    if not nums:
        return 0
    if len(nums) == 1:
        return nums[0]

    # 情况1:偷第一个房间,不偷最后一个房间
    dp1 = [0] * len(nums)
    dp1[0] = nums[0]
    dp1[1] = max(nums[0], nums[1])
    for i in range(2, len(nums) - 1):
        dp1[i] = max(dp1[i - 1], dp1[i - 2] + nums[i])

    # 情况2:不偷第一个房间,偷最后一个房间
    dp2 = [0] * len(nums)
    dp2[0] = 0
    dp2[1] = nums[1]
    for i in range(2, len(nums)):
        dp2[i] = max(dp2[i - 1], dp2[i - 2] + nums[i])

    # 返回两种情况的最大值
    return max(dp1[-2], dp2[-1])


# 输入处理
n = int(input())
nums = list(map(int, input().split()))
# 输出结果
print(rob(nums))

全部评论

相关推荐

LXXXXd:有点杂,想搞自动化的话没必要把法律的经历写上去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务