class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() <= 0){
return 0;
}
if(nums.size() == 1){
return nums[0];
}
if(nums.size() == 2){
return max(nums[0], nums[1]);
}
vector<int> dp(nums.size() + 1, 0);
dp[1] = nums[0];
dp[2] = max(nums[0], nums[1]);
for(int i = 3; i <= nums.size(); i++){
// 偷不偷第i个房屋,偷的话则是dp[i -2] + nums[i-1]
// 不偷的话,则是dp[i - 1]
// 所以状态转移方程为 dp[i] = max(dp[i - 1], dp[i -2] + nums[i-1])
dp[i] = max(dp[i - 1], dp[i -2] + nums[i-1] );
}
return dp[nums.size()];
}
};
优化版本
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() <= 0){
return 0;
}
if(nums.size() == 1){
return nums[0];
}
if(nums.size() == 2){
return max(nums[0], nums[1]);
}
int dp0 = nums[0];
int dp1 = max(nums[0], nums[1]);
int dp2 = 0;
for(int i = 3 ; i<= nums.size(); i++){
dp2 = max(dp1, dp0 + nums[i-1]);
dp0 = dp1;
dp1 = dp2;
}
return dp2;
}
};