198. 打家劫舍

(一)题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

(二)思路

动态规划,加前前一个,和前一个比

(三)我的代码

复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int len=nums.size();
        if(len<=1){
            return nums[0];
        }
        if(len==2){
            return max(nums[0],nums[1]);
        }
        nums[2]=max(nums[0]+nums[2],nums[1]);
        for(int i=3;i<len;i++){
            nums[i]=max(nums[i-3]+nums[i],nums[i-2]+nums[i]);
            nums[i]=max(nums[i],nums[i-1]);
        }
        return nums[len-1];
    }
};
复制代码

(四)其他人的代码

复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        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];
    }
};
复制代码

(五)对比分析

为什么我的代码一共算了前三个?

因为我考虑了这个样例:[10,1,2,11],显然,这个样例结果是21。

我认为要从前面第三个考虑,(从前面第四个就不用了,一定会有中间的可以去抢)。但是在数值2,会考虑到数值10,就不用担心会漏掉。

此外,初始化也很关键,若将

dp[1] = max(nums[0], nums[1]);

改为

dp[1] = nums[1];

运行结果会错误

posted @   ImreW  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示