题目描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算在不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。(不能同时闯入相邻的房间)

方法1:动态规划,f(k)=max{f(k−1),H(k)​+f(k−2)},f(k)表示前k个房子能偷到最大金额,H(k)表示第k个房子存放金额

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int>dp(nums.size()+1,0);
        dp[0] = 0;
        dp[1] = nums[0];
        for(int i=2;i<=nums.size();i++){
            dp[i] = max(dp[i-1],dp[i-2] + nums[i-1]);
        }
        return dp[nums.size()];
    }
};

方法2:动态规划空间优化,计算 f(n) 的时候,只用到了 f(n−1) 和 f(n−2) 的结果。n−2之前的子问题,已经用不到了,所以不需要用数组来存储dp数据

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int>dp(nums.size()+1,0);
        int p = 0;//存n-2
        int q = nums[0];//存n-1
        int m = q;
        for(int i=1;i<nums.size();i++){
            m = max(p+nums[i],q);
            p = q;
            q = m;
            
        }
        return m;
    }
};