题目:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例 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 。
链接:https://leetcode-cn.com/problems/house-robber
思路:
1、这道题可以用动态规划来进行解决,假设用dp来存储房屋的值,则dp[i]等价于dp[i-2]位置的值加上当前房屋i的价值 和 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];
}
};