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 @   穿过雾的阴霾  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示