动态规划
- 对于第 i 家,有两种选择
- 偷,dp[i] = d[i-2] + nums[i]
- 不偷,dp[i] = dp[i-1]
- 状态转移方程:dp[i] = max(dp[i-1], dp[i-2] + nums[i])
- 边界:
- i=0时,dp[0]=nums[0]
- i=1时,dp[1] = max(nums[0], nums[1])
class Solution {
public:
int rob(vector<int>& nums) {
int len = nums.size();
if(len == 1)
return nums[0];
vector<int> dp(len,0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i=2;i<len;i++)
{
dp[i] = max(dp[i-2] + nums[i], dp[i-1]);
}
return dp[len-1];
}
};
内存优化
class Solution {
public:
int rob(vector<int>& nums) {
int len = nums.size();
if(len == 1)
return nums[0];
int pre_pre_dp = nums[0];
int pre_dp = max(nums[0], nums[1]);
for(int i=2;i<len;i++)
{
int tmp = pre_dp;
pre_dp = max(pre_pre_dp + nums[i], pre_dp);
pre_pre_dp = tmp;
}
return pre_dp;
}
};