題目:
你是一個(gè)專業(yè)的小偷芜辕,計(jì)劃偷竊沿街的房屋。每間房?jī)?nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng)劣摇,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會(huì)自動(dòng)報(bào)警弓乙。
給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組末融,計(jì)算你在不觸動(dòng)警報(bào)裝置的情況下,能夠偷竊到的最高金額暇韧。
示例 1:
輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號(hào)房屋 (金額 = 1) 勾习,然后偷竊 3 號(hào)房屋 (金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 懈玻。
示例 2:
輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號(hào)房屋 (金額 = 2), 偷竊 3 號(hào)房屋 (金額 = 9)巧婶,接著偷竊 5 號(hào)房屋 (金額 = 1)。
偷竊到的最高金額 = 2 + 9 + 1 = 12 涂乌。
鏈接:https://leetcode-cn.com/problems/house-robber
思路:
1艺栈、這道題可以用動(dòng)態(tài)規(guī)劃來進(jìn)行解決,假設(shè)用dp來存儲(chǔ)房屋的值湾盒,則dp[i]等價(jià)于dp[i-2]位置的值加上當(dāng)前房屋i的價(jià)值 和 dp[i-1]位置的值中的最大值湿右,即dp[i] = max(dp[i-2]+nums[i], dp[i-1])
Python代碼如下:
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
size = len(nums)
if size==0:
return 0
elif size==1:
return nums[0]
dp = []
for i in range(size):
item = nums[i]
if i==0:
dp.append(item)
elif i==1:
dp.append(max(nums[0], nums[1]))
else:
imax = max(dp[i-2]+nums[i],dp[i-1])
dp.append(imax)
return dp[size-1]
C++代碼:
class Solution {
public:
int rob(vector<int>& nums) {
int size = nums.size();
if (size==0) return 0;
if (size==1) return nums[0];
if (size==2) return max(nums[0],nums[1]);
vector<int> dp;
for (int i=0; i<size; i++){
if (i==0){
dp.push_back(nums[0]);
}else if(i==1){
dp.push_back(max(nums[0], nums[1]));
}else{
int item = max(dp[i-2]+nums[i], dp[i-1]);
dp.push_back(item);
}
}
return dp[size-1];
}
};