LeetCode 213. 打家劫舍 II

  • 可以直接分类讨论,分别枚举第一个房屋偷或不偷的情况,最后再取极值
  • 不偷第一家
    • f[i] 代表前 i 个房屋,偷第 i 个, 且不偷第一家的最大值
    • g[i] 代表前 i 个房屋,不偷第 i 个, 且不偷第一家的最大值
  • 偷第一家
    • f[i] 代表前 i 个房屋,偷第 i 个, 且偷第一家的最大值
    • g[i] 代表前 i 个房屋,不偷第 i 个, 且偷第一家的最大值

代码

class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        if(n==1)    return nums[0];
        vector<int> f(n+1),g(n+1);
        //不偷第一家
        f[1]=INT_MIN;//状态不合法,设为负无穷,不让其更新状态
        for(int i=2;i<=n;i++)
        {
            g[i]=max(f[i-1],g[i-1]);
            f[i]=g[i-1]+nums[i-1];
        }
        int res=max(g[n],f[n]);
        //偷第一家
        f=vector<int> (n+1);
        g=vector<int> (n+1);
        f[1]=nums[0];g[1]=INT_MIN;//状态不合法,设为负无穷,不让其更新状态
        for(int i=2;i<=n;i++)
        {
            g[i]=max(f[i-1],g[i-1]);
            f[i]=g[i-1]+nums[i-1];
        }
        res=max(res,g[n]);//偷第一家的话,f[n]一定不能是答案
        return res;
    }
};
posted @ 2023-05-15 14:00  穿过雾的阴霾  阅读(23)  评论(0)    收藏  举报