class Solution {
public:
int rob(vector<int>& nums) {
/*
问题拆解:
不触发报警偷窃到最高金额 -> 不触发报警 + 偷窃到最高金额
不触发报警:以 i 代表房屋编号,对应nums数组下标 + 2
偷窃最高金额:在所有不触发报警的房屋中选择出金额最大的组合
dp[i] : 以 i 代表选择的房屋标号,dp[i]表示从0-到该房屋标号的所有房屋中不放回的选择组合出的最大金额数
dp[i] = max(不选择,选择)
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
*/
if (nums.size() == 0) return 0;
if (nums.size() == 1) return nums[0];
vector<int> dp(nums.size());
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < nums.size(); i++) {
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[nums.size() - 1];
}
};
<Talk is cheap, show me the code 18> LeetCode.198 打家劫舍
于 2024-07-02 18:59:13 首次发布