当前位置: 首页 > ops >正文

动态规划-LCR 090.打家劫舍II-力扣(LeetCode)

一、题目解析

本题与打家劫舍的最大区别在于房子不是线性分布的了,而是首尾相连的环形分布,即如果偷了第一间房子,那么最后一间房子就不能偷了,因为它们是相连的。

二、算法原理

在分析之前我们可以先讨论上面提到的第一间房子偷or不偷的不同状态

 

我们需要求两者中的最大值,所以max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1))

这里将问题转化,可以选择回顾打家劫舍,也可以继续往下看,因为都是差不多的。

链接:动态规划-LCR 089.打家劫舍-力扣(LeetCode)-CSDN博客

1.状态表示

对于到达i位置时,此时金额最大,并且存在该位置是否偷窃的问题,所以f[i]表示:到达i位置时,偷房间时,此时的最大金额;g[i]表示:到达i位置时,不偷房间,此时的最大金额

2.状态转移方程

省流:f[i]=g[i-1]+nums[i]

           g[i]=max(f[i-1],g[i-1]) 

3.初始化

f[0]=nums[0],g[0]=0,rob1函数初始化为f[left]=nums[left],g[left]=0,这里的rob1函数就是打家劫舍里的函数修改符合区间操作的。

4.填表顺序

从左往右,两个表一起填

5.返回值

打家劫舍返回值为max(f[n-1],g[n-1])(n为nums的大小),打家劫舍II的返回值为max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1))

这里我们的分析是有点错误的对于区间的处理划分,假如数据小于等于3呢?这里是一个小坑

根据上面的思路,自己动手实现,链接:LCR 090. 打家劫舍 II - 力扣(LeetCode)

三、代码示例

class Solution {
public:int rob1(vector<int>& nums,int left,int right) {int n = nums.size();vector<int> f(n),g(n,0);f[left] = nums[left];for(int i = left;i<=right;i++){f[i] = g[i-1]+nums[i];g[i] = max(f[i-1],g[i-1]);}return max(f[right],g[right]);}int rob(vector<int>& nums) {int n = nums.size();if(n == 1) return nums[0];if(n == 2) return max(nums[0],nums[1]);if(n == 3) return max(nums[0],nums[1]);return max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1));}
};

我们之前的分析是建立在nums的大小大于4的基础上的,但给出小于等于3的nums时我们分析的逻辑就排不上用场了,所以需要单独这三种情况 

 

 

看到最后,如果对您有所帮助,还请点赞、收藏、关注一波,点点关注不迷路,我们下期再见!

 

http://www.xdnf.cn/news/7588.html

相关文章:

  • 文档债务拖累交付速度?5大优化策略文档自动化
  • 电子电器架构 --- 汽车高性能计算
  • 【踩坑】WUDFHost占用内存高的可能原因
  • 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求
  • 深入解析 OpenManus:开源 AI 智能体框架的技术原理与实践
  • 分钟级降水预报API:精准预测每一滴雨的智慧科技
  • 【物联网】基于树莓派的物联网开发【5】——国内软件镜像源更改配置
  • 使用布隆过滤器实现java大数据筛选是否存在
  • 如何解决虚拟机中U盘无法识别的问题
  • 抖音视频如何下载保存?高清无水印一键保存到手机!
  • 基于Gitee 的开发分支版本管理规范
  • 视频监控联网系统GB28181协议中互联结构详解
  • AI大模型应用微调服务商分享:微调技术Lora和SFT的异同
  • 8 定时任务与周期性调度
  • 小红书“开门”,摸到电商金钥匙?
  • Linux(3)——基础开发工具
  • langchain 实现 任务分解器
  • 深度学习中的正则化方法与卷积神经网络基础
  • leetcode hot100:三、解题思路大全:哈希(两数之和、字母异位词分组、最长连续序列)、双指针(移动零、盛最多水的容器、三数之和、接雨水)
  • beanstalk一直被重新保留(reserved 状态)消息删除
  • BACnet协议详解:架构、应用、挑战与未来发展
  • WIFI信号状态信息 CSI 深度学习之数据集
  • 基于自然语言转SQL的BI准确率如何?
  • C语言指针深入详解(四):指针变量、二维数组传参的本质、函数指针数组、转移表
  • FastDatasets新功能,让模型学会“思考”!
  • 双指针法高效解决「移除元素」问题
  • python学习打卡day31
  • vue+springboot+element-ui实现table的树懒加载
  • 【windows】音视频处理工具-FFmpeg(合并/分离)
  • SpringCloud+Vue实现大文件分片下载(支持开始、暂停、继续、取消)