原題鏈接:https://leetcode-cn.com/problems/house-robber/
題目:
你是一個專業(yè)的小偷,計劃偷竊沿街的房屋。每間房內(nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng)蛛壳,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會自動報警。
給定一個代表每個房屋存放金額的非負(fù)整數(shù)數(shù)組调限,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額误澳。
示例 1:
輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) 旧噪,然后偷竊 3 號房屋 (金額 = 3)。偷竊到的最高金額 = 1 + 3 = 4 脓匿。
示例 2:
輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9)淘钟,接著偷竊 5 號房屋 (金額 = 1)。偷竊到的最高金額 = 2 + 9 + 1 = 12 陪毡。
解題方案:
可以用動態(tài)規(guī)劃的思路進(jìn)行階梯米母,先計算出最簡單的兩種情況:
- 當(dāng)只有1家房屋時,可以偷竊到的金額dp[0] = nums[0]毡琉;
- 當(dāng)只有2家房屋時铁瞒,可以偷竊到的最大金額為2家房屋中最大的值,即dp[1] = Max(nums[0],nums[1])桅滋;
- 最后擴(kuò)展到當(dāng)有i(i>2)家房屋時慧耍,由于不能偷竊相鄰的值,所以要進(jìn)行對nums[i]丐谋,dp[i-1]芍碧,dp[i-2]判斷,即可以偷竊到的最大金額為dp[i] = Max(nums[i] + dp[i-2],dp[i-1])号俐;
代碼:
class Solution {
public int rob(int[] nums) {
int n = nums.length;
if(n==0) return 0;
if(n ==1) return nums[0];
int[] ss = new int[n];
ss[0] = nums[0];
ss[1] = Math.max(nums[0],nums[1]);
for(int i = 2; i<n;i++) {
// 動態(tài)規(guī)劃
ss[i] = Math.max(nums[i]+ss[i-2], ss[i-1]);
}
return ss[n-1];
}
}
代碼提交結(jié)果:
運行結(jié)果