1def rob(nums):
2 if len(nums) == 1:
3 return nums[0]
4
5 # Case 1: Rob houses 0 to n-2
6 dp = [0] * (len(nums) - 1)
7 dp[0] = nums[0]
8 dp[1] = max(nums[0], nums[1])
9
10 for i in range(2, len(dp)):
11 rob = dp[i - 2] + nums[i]
12 not_rob = dp[i - 1]
13 dp[i] = max(rob, not_rob)
14
15 case_1_max = dp[-1]
16
17 # Case 2: Rob houses 1 to n-1
18 dp = [0] * (len(nums) - 1)
19 dp[0] = nums[1]
20 dp[1] = max(nums[1], nums[2])
21
22 for i in range(2, len(dp)):
23 rob = dp[i - 2] + nums[i + 1]
24 not_rob = dp[i - 1]
25 dp[i] = max(rob, not_rob)
26
27 case_2_max = dp[-1]
28
29 return max(case_1_max, case_2_max)