/* Code language: C/C++ */ classSolution { public: /* 两次动态规划 */ introb(vector<int>& nums){ int n = nums.size(); if (n == 1) return nums[0]; returnmax(my_rob(nums, 1, n), my_rob(nums, 0, n - 1)); }
/* 动态规划 + 滚动数组 */ /* x, y, z 分别表示前i - 2, i - 1, i个房屋所能偷到的最大值 */ intmy_rob(vector<int>& nums, int begin, int end){ int n = end - begin; int x = nums[begin], y = max(nums[begin], n > 1 ? nums[begin + 1] : 0), z; for (int i = begin + 2; i < end; ++i) { z = max(x + nums[i], y); x = y; y = z; } return y; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# Code language: Python classSolution: # 两次动态规划 defrob(self, nums: List[int]) -> int: n = len(nums) # x, y 分别表示前i - 1, i个房屋所能偷到的最大值 x, y = nums[0], max(nums[0], nums[1] if n > 1else0) for i inrange(2, n - 1): x, y = y, max(x + nums[i], y) ans = y # x, y 分别表示前i - 1, i个房屋所能偷到的最大值 x, y = 0, max(0, nums[1] if n > 1else0) for i inrange(2, n): x, y = y, max(x + nums[i], y)
# Code language: Python classSolution: # 动态规划+记忆化dfs defrob(self, nums: List[int]) -> int: n = len(nums) # x, y 分别表示前i - 1, i个房屋所能偷到的最大值 x, y = nums[0], max(nums[0], nums[1] if n > 1else0) for i inrange(2, n - 1): x, y = y, max(x + nums[i], y)