198. House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security systems connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given an integer array nums representing the amount of money of each house, return the maximum amount of money you can rob tonight without alerting the police.
Example 1:
Input: nums = [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).Total amount you can rob = 1 + 3 = 4.
Example 2:
Input: nums = [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).Total amount you can rob = 2 + 9 + 1 = 12.
Constraints:
- 1 <= nums.length <= 100
- 0 <= nums[i] <= 400
From: LeetCode
Link: 198. House Robber
Solution:
Ideas:
- We handle base cases where the size of nums is 0 or 1.
- We create an array dp to store the maximum amount that can be robbed up to each house.
- The first element of dp is the amount in the first house, and the second element is the maximum of the first two houses.
- For each subsequent house i, we calculate the maximum amount that can be robbed by comparing:
- The amount robbed by robbing the current house i (which is nums[i] + dp[i - 2]) and not robbing the immediate previous house.
- The amount robbed by not robbing the current house (which is dp[i - 1]).
- Finally, we return the last element of the dp array, which represents the maximum amount that can be robbed from the entire street.
Code:
c
int rob(int* nums, int numsSize) {
if (numsSize == 0) return 0;
if (numsSize == 1) return nums[0];
int dp[numsSize];
dp[0] = nums[0];
dp[1] = nums[1] > nums[0] ? nums[1] : nums[0];
for (int i = 2; i < numsSize; i++) {
dp[i] = (nums[i] + dp[i - 2]) > dp[i - 1] ? nums[i] + dp[i - 2] : dp[i - 1];
}
return dp[numsSize - 1];
}