《Leetcode|线性排列|198. 打家劫舍》 《Leetcode|环形排列|213. 打家劫舍 II》 《Leetcode|树形排列|337. 打家劫舍 III》
【状态】:选择偷或者不偷对应房子的索引
【选择】:①不偷第i家;②偷第i家
【dp
函数含义】:偷完前i家后所得最大金额为dp[i]
【状态转移】: dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
class Solution {
public:
int rob(vector<int>& nums) {
int size = nums.size();
if (size == 1) return nums[0];
// dp数组含义:偷完前i家后所得最大金额为dp[i]
vector<int> dp(size, 0);
// 边界初始化
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < size; i++)
// dp[i] = max(不偷第i家, 偷第i家)
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
return dp[size - 1];
}
};