解题思路
动态规划
dp[i]:第i个房间可盗窃的最大值
由于不可以在相邻的房屋闯入,所以在当前房屋i可盗窃的最大值,要么就是i-1房屋可盗窃的最大值,要么就是
i-2房屋可盗窃的最大值加上当前房屋的值,二者之前取最大值
dp[i] = max(dp[i - 1], nums[i-1] + dp[i - 2]); 其中nums[i-1]为当前房屋的值
使用循环的方式自底向上实现该思想
时间复杂度O(n)
空间复杂度O(n)
代码
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() == 0) return 0;//对size==0特判
if (nums.size() == 1) return nums[0];//对size==1特判
//
vector<int> dp(nums.size()+1);
//边界值
dp[1] = nums[0];//第1个房屋可盗窃的最大值
dp[2] = max(nums[1], dp[1]);//第2个房屋可盗窃的最大值
//状态转移
for (int i = 3; i <nums.size()+1; i++)
{
dp[i] = max(dp[i - 1], nums[i-1] + dp[i - 2]);
}
return dp[nums.size()];
}
};