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];
运行结果会错误
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了