打家劫舍与动态规划总结

动态规划介绍

动态规划类似数学中的递推关系,或者更通俗地讲数列的递推关系,根据前一项与后一项之间的关系,能够推导出后一项,而一般情况下都是根据数组前面的n-1项,推导出第n项,这很有可能就是我们要求的。这种递推也可以叫做状态转移,而数组的初始值我们也可以叫做初始状态。

而打家劫舍这两题,主要是数列递推范围的问题。

打家劫舍(一)是从数组中选取最大的和,而绝对不能选取相邻的元素。

打家劫舍(二)是在上述基础上增加了首尾相连,形成了环形。

技巧

反正都是选取不相邻数字之最大和,但是因为数组有的元素可能会非常大,为了选取这个元素可能会连续舍弃掉多个附近的元素,因此不能简单地认为选取元素越多,最后结果越大,因此贪心思想在此处不可行。

对于数组每个元素,我们都有选择或是不选择两种情况,如果该处没有选择这个元素,那么到它为止拿到的元素总和就取决于它前一个元素,因为它前一个可以选;如果该处选择了这个元素,那么到它为止拿到的元素就不能考虑它前一个,只能考虑它后面一个元素。因此我们用dp[i]dp[i]表示到ii为止所能拿到的最大和,对于动态规划两个重要点:

  • 初始状态: 如果数组长度为1,把这个元素拿了收益最大,因此dp[1]=nums[0]dp[1] = nums[0]
  • 状态转移: 每次对于一个元素,我们选择拿走或者不拿走,如果我们选择拿走那么前一个元素必定不能拿,因此累加的再前一个的最多收益,同理如果选择不拿走,那我们最多可以累加前一个元素的收益。因此转移方程为dp[i]=max(dp[i1],nums[i1]+dp[i2])dp[i] = max(dp[i - 1], nums[i - 1] + dp[i - 2])。这里的i在dp中为数组长度,在nums中为下标。

不同点

  • 打家劫舍(一)属于基本题,可以正常按照上述思路,动态规划转移状态得到结果。可以参考如下图:

alt

  • 打家劫舍(二)为进阶版增加了首尾不能同时选择,既然不能同时选择,我们就事先将其分开,绝不让他们有机会被同时选择。因此第一轮遍历就不用遍历到最后一位,第二轮遍历现将第一个元素置为0,两种情况选择较大值就可以了,可以参考如下图: alt
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论

相关推荐

1、自我介绍2、Agent项目是实习项目还是个人项目?有没有上线?3、拷打实习(10min)4、大模型微调,你的训练数据集是如何构建的?数据量有多大?5、在构建数据集的过程中,遇到了哪些挑战?花了多长时间?6、你之前的实习经历偏后端工程,你未来的职业规划更倾向于纯后端开发,还是希望从事与AI/大模型结合的工作?7、详细讲一下Golang中Channel的概念和作用,它是否是并发安全的?8、Channel和传统的锁(Mutex)在实现并发控制时有什么区别?各自的适用场景是什么?9、讲一下GMP模型10、当P的本地队列为空或者不为空时,它会怎么去调度G(协程)?11、Redis支持哪些数据结构12、为什么Redis的速度这么快13、如何实现一个类似淘宝搜索框的实时商品名称模糊搜索功能?14、实时输入联想与输入完成后点击搜索在技术实现上有什么本质区别?15、实时搜索通常使用什么网络协议(如WebSocket)?你了解或有使用过吗?讲一下16、请详细说明微信扫码登录的完整流程和背后发生的原理17、在微服务架构中,服务发现和负载均衡是如何实现的?18、服务注册中心(如Nacos, Consul)是如何工作的?服务实例如何注册和保活(如通过心跳机制)?19、讲一下Agent中的“长短期记忆”20、什么样的信息应该放在长期记忆,什么样的信息放在短期记忆?21、当对话轮数很多,上下文窗口不足时,有哪些处理策略?(如截断、压缩)22、如果要进行记忆压缩,通常有哪些方法?23、了解过Agent的设计范式吗?有哪些?24、你设计的Agent是怎么实现ReAct模式的?详细讲讲25、手撕:实现一个并发任务处理器:给定一个包含100个任务ID的列表,要求控制最大并发数为3,模拟并发调用某个外部接口(如打印ID)26、反问
三本咋了:很好的面筋
查看24道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务