题解 | 打家劫舍(二)

打家劫舍(二)

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

import sys

# 22:30
# 和打家劫舍不同的是环形
# 分两种情况,如果第一家偷,那么最后一家不能偷,最大的为dp1(n-1)
# 如过第一家不偷,最大的为dp2(n),分为两种情况dp
# 第一家偷, 第二家不能偷,相当于从第三家开始dp + 第一家的钱
# 第一家不偷,相当于从第二家开始dp

n = int(input())

money = list(map(int, input().split()))

dp1 = [0] * (n+1) # 第一家偷, 第二家不能偷,相当于从第三家开始dp
dp2 = [0] * (n+2) # 第一家不偷,相当于从第二家开始dp

if n < 3:
    print(0)
else:
    dp1 = [0] * (n+1) # 第一家偷, 第二家不能偷,相当于从第三家开始dp, 并且最后最大值是dp[n-1]
    dp1[2] = money[0]
    dp1[1] = money[0]
    dp2 = [0] * (n+1) # 第一家不偷,相当于从第二家开始dp
    for i in range(2,n+1):
        if i>2:
            dp1[i] = max(dp1[i-1],dp1[i-2]+money[i-1])
        dp2[i] = max(dp2[i-1],dp2[i-2]+money[i-1])
    max_value = max(dp1[-2],dp2[-1])
    print(max_value)

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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