解题思路
动态规划
用dp[i]来记录到第i个房屋的时候能够拿到的最高金额。
转移方程:
dp[i]=max(nums[i]+dp[i-2],nums[i]+dp[i-3]);
意思是,这个房屋的钱加上之前所能偷到的最高金额,为什么不用nums[i]+dp[i-4]呢,因为根据题意,dp[i-4]+nums[i-2]+nums[i]这样不是更多钱吗?
根据转移方程,for循环体中i从3开始,我们需要计算dp[0]、dp[1]、dp[2]。
代码实现如下:
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n==1)return nums[0];
if(n==2)return max(nums[0],nums[1]);
if(n==3)return max(nums[0]+nums[2],nums[1]);
//动态规划,dp[i]代表到第i个房屋,所能偷的最高金额
//返回dp[n-1]/dp[n-2]即可
vector<int> dp(n,0);
//初始化
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
dp[2]=max(nums[0]+nums[2],nums[1]);
for(int i=3;i<n;++i)
dp[i]=max(nums[i]+dp[i-2],nums[i]+dp[i-3]);
return max(dp[n-1],dp[n-2]);
}
};