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

C语言力扣刷题11——打家劫舍1——[线性动态规划]

力扣刷题11——打家劫舍1和2——[线性动态规划]

  • 一、博客声明
  • 二、题目描述
  • 三、解题思路
    • 1、线性动态规划
      •  a、什么是动态规划
    • 2、思路说明
  • 四、解题代码(附注释)

一、博客声明

  找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟这个系列来记录。代码可能不是自己写的,不求方法最好,只求更多地理解大佬们的解题思路。


二、题目描述

  你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 2

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示

1 <= nums.length <= 100
0 <= nums[i] <= 400

三、解题思路

1、线性动态规划

 a、什么是动态规划

  动态规划不是一种算法,而是一种思想和解题策略。而要掌握动态规划比较难,小编还没有掌握,还在努力算题中。也不知道该怎么解释。推荐大家去看下面的视频:
  视频1:【动态规划】这可能是最好懂的动态规划入门教程
  视频2:动态规划入门50题

2、思路说明

  换种理解方式,如果有A,B,C,D四个区域,如何保证我穿过四个区域走的路程最长?是不是就是只要保证每个区域都走最长的路,就可以保证四个区域后,我走的路程最长。
  那么打家劫舍这个题目,换个思想,只要保证我到第i家时,不管偷还是不偷,手里积累的钱是两种策略(偷和不偷)中最多的就可以了。如果偷的话,钱就变为偷到前前一家积累的钱加上这家的钱,不偷的话就是偷到前一家积累的钱。比较这两个谁大就可以了。然后就是保存好偷到第i-2家和偷到第i-1家积累的钱,方便对下一家是否偷作为判断依据。
  1、如果数组长度等于1,返回nums[0]
  2、如果数组长度等于2,返回fmax(nums[0], nums[1])
  3、如果数组长度大于2,就需要从第三房子开始判断,偷还是不偷这两种选择,哪种选择能让当前手中积累的钱更多;

在这里插入图片描述

  打家劫舍2只需要考虑偷盗的范围就可以了,代码最后一行变为return fmax(stealRang(nums, 0, numsSize - 2), stealRang(nums, 1, numsSize - 1));。也就是考虑第一家偷的话,最后一家就不能偷,范围就变为从第0家偷到numsSize-2家;如果不偷第一家,范围就变成了从第1家偷到第numsSize-1家;比较这两个谁大就可以了。
 


四、解题代码(附注释)

///偷窃范围,从第start家到第end家。
int stealRang(int* nums, int start, int end){int first = nums[start], second = fmax(first, nums[start+1]);for(int i = start + 2; i <=end; i++){int temp = second;//考虑第i家,偷与不偷,哪个得的钱更多,不偷就还是原来的second值,偷就是前一家+该家金额second = fmax(second, first + nums[i]);first = temp;}return second;
}//该题目为属于线性动态规划题目
int rob(int* nums, int numsSize) {if(numsSize <= 1){//长度为1,返回第一个元素return nums[0];}if(numsSize == 2){//长度为2,返回两个元素中最大的return fmax(nums[0], nums[1]);}return stealRang(nums, 0, numsSize - 1);//返回最大值//return fmax(stealRang(nums, 0, numsSize - 2), stealRang(nums, 1, numsSize - 1)); //打家劫舍2返回这个
}
http://www.lryc.cn/news/392350.html

相关文章:

  • 房屋租赁管理小程序的设计
  • oracle sql语句 排序 fjd = ‘0101‘ 排在 fjd = ‘0103‘ 的前面
  • 初试成绩占比百分之70!计算机专硕均分340+!华中师范大学计算机考研考情分析!
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十)-git(2)
  • JMH320【亲测】【御剑九歌】唯美仙侠手游御剑九歌+WIN学习手工端+视频教程+开服清档+运营后台+授权GM物品充值后台
  • 【matlab】信号分解/故障诊断——智能优化算法优化VMD
  • 【重磅】万能模型-直接能换迪丽热巴的模型
  • Web基础和HTTP协议
  • Mini-L-CTF-2022 minispringboot Thymeleaf模板注入 spel的绕过
  • LLM - 神经网络的组成
  • C++:拷贝构造函数
  • 云服务出现故障这样处理
  • CVPR2024自动驾驶轨迹预测方向的论文整理
  • 数据结构——队列练习题
  • PLL和CDR的内部结构及其区别
  • HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)
  • 华为交换机 LACP协议
  • node 下载文件到网络共享目录
  • STM32基础知识
  • 安装docker版rabbitmq 3.12
  • c++重定向输出和输出(竞赛讲解)
  • 实在智能对话钉钉:宜搭+实在Agent,AI时代的工作方式
  • MySQL的Docker部署方式
  • 光伏电站数据采集方案(基于工业路由器部署)
  • 一文让你彻底搞懂什么是CDN
  • 1023记录
  • 【并发编程JUC】AQS详解
  • 如何找BMS算法、BMS软件的实习
  • AR视频技术与EasyDSS流媒体视频管理平台:打造沉浸式视频体验
  • 每天一个数据分析题(三百九十九)- 逻辑回归