动态规划系列之五打家劫舍
1|0题目
打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
1|1解题思路
本题本质上还是求一个子数组累计和最大值,但与前面的题目略有不同。前面说过能够代表动态规划的两个题目:最大子序和是求连续
的子数组的累积和;梅花桩是最长上升子数组,是求不连续
的子数组的上升数组。而本题是一个新增的类型,求子数组,要求间隔一个取一个。
那么解题思路和前面的类似,还是构建一个dp数组,不断填充dp数组的值,最后一位就是所求。
1|2建立数学模型
构建dp数组,以dp[i]代表第i个房间能够偷窃到的最高金额
1|3状态转移方程
状态转移方程应该这么思考:以[2,7,9,3,1]为例,房间一共有5个。
求解第5个房间,要知道知道第4个房间,求解第4个房间要知道第3个房间,一直到第一个房间。已知第一个房间的偷窃最大值是2。
第二个房间最大值:拿当前房间的,或者不拿当前房间的,比较哪一个大。max(2,7) = 7,所以第二个房间最大值为7
第三个房间最大值:拿当前房间的和第一个房间的,或者不拿值为第二房间最大值。max(2+9,7) = 11,所以第三个房间的最大值11
第四个房间最大值:拿当前房间和第二个房间的,或者不拿值为第三个房间最大值。max(7+3,11) = 11,所以第四个房间的最大值11
第五个房间最大值:拿当前房间和第三个房间的,或者不拿值为第四个房间最大值。max(11+1,11) = 12,所以第五个房间的最大值为12
根据这个规律,可以发现就是比较当前房间的值+前两个房间的最大值和前一个房间的最大值,即:arr[i] + dp[i-2]
和 dp[i-1]
1|4边界值
边界值很明显,第一个房间的最大值就是arr[0],第二个房间的最大值要比较是max(arr[0], arr[1])。即哪一个大就取哪一个。
2|0代码实现
__EOF__

本文链接:https://www.cnblogs.com/goldsunshine/p/13770194.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理