198. 打家劫舍
class Solution {
public:
int rob(vector<int>& nums) {
/*
1.分析子问题
2.写出子问题的递推关系,可以先用注释把思路写下来
3.确定DP数组的计算顺序
*/
int numsSize = nums.size();
vector<int> dp(numsSize+1, 0);
// 当i = 0时,dp[0] = nums[0]
// 当i = 1时,应该是第0个元素和第1个元素之间的最大值
// 如果第i个元素取,则最高金额 = 前i - 2个元素的最高金额 + 第i个元素的和
// 如果第i个元素不取,则最高金额 = 前i- 1个元素的和
dp[0] = nums[0];
for(int i = 1; i < numsSize; i++){
if(i == 1){
dp[1] = max(nums[0], nums[1]);
}
else{
dp[i] = max((dp[i -2] + nums[i]), dp[i - 1]);
}
}
return dp[numsSize - 1];
}
};