198 打家劫舍
一個小偷計劃偷竊沿街的房屋。每間房內都藏有一定的現金,但相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 1:
輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。偷竊到的最高金額 = 1 + 3 = 4 。
--------------------------------------------------------------------------------------------------
思路:定義一個數組dp表示前i個房子中能搶到的最大現金:、
- 當i = 1時,dp[0] = nums[0];當i = 2時,dp[1] = max(nums[0], nums[1])。
- 對於i > 2,從兩個選擇中選最大的:搶第i個房子,並加上dp[i - 2];不搶第i個房子,保持現有最大現金。
public int rob(int[] nums) {
int length = nums.length;
if(length <= 1) return (length == 0) ? 0 : nums[0];
int[] dp = new int[length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for(int i = 2; i < length; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[length - 1];
}