分治法:将问题分为两种可能的情形处理,收集分类信息和处理每一种情形都只可以利用打家劫舍(一)的算法完成。
n = int(input())
nums = list(map(int, input().strip().split()))
# 处理输入极短的情况,避免指针越界
if len(nums) == 1:
print(nums[0])
elif len(nums) in [2,3]:
print(max(nums))
elif len(nums) == 4:
print(max(nums[0]+nums[2], nums[1]+nums[3]))
# 主要情况
else:
a,b = nums[0:2]
for i in range(2,n-1):
a,b = b,max(a+nums[i],b)
b0 = b
# Case 1:最后一家恰好不会被偷
if a+nums[-1] <= b:
print(b)
# Case 2: 最后一家会被偷,此时第1家和最后2家是否被偷都已确定,
# 问题从环状列表转化为顺序列表
else:
num = nums[-1]
nums = nums[1:-1]
a,b = nums[0:2]
for i in range(2,n-3):
a,b = b,max(a+nums[i],b)
print(max(b+num, b0))