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
dp를 이용해 매 순간 상태에 따른 최대값을 저장하면 되는 문제다.
옆집을 같은 날에 터는 건 불가능하므로 집을 털 때마다 이전에 집을 털었는지 여부를 각각 검토해야 한다.
집을 털었을 때 최대값과 집을 털지 않았을 때 최대값을 각각 저장하고 모든 집을 다 조회한 뒤, 둘 중 더 큰 값을 리턴하면 된다.
class Solution {
public int rob(int[] nums) {
int[][] dp = new int[nums.length][2];
// 0 → rob is not possible, 1 → rob is possible
dp[0][0] = nums[0];
for (int i=1; i < nums.length; i++) {
dp[i][0] = dp[i-1][1] + nums[i];
dp[i][1] = Math.max(dp[i-1][0], dp[i-1][1]);
}
return Math.max(dp[nums.length-1][0], dp[nums.length-1][1]);
}
}