环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧

环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧

环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧

🌺The Begin🌺点点关注,收藏不迷路🌺

1、问题描述

你是一个专业的小偷,计划偷窃环形排列的房屋。每间房屋都有一定金额,但如果偷窃相邻的两间房屋就会触发警报。计算在不触发警报的情况下能够偷窃到的最高金额。

2、解题思路

这个问题是经典打家劫舍问题的变种,房屋排列成环形。我们可以将其分解为两个子问题:

  1. 不偷第一间房屋
  2. 不偷最后一间房屋
    然后取这两个子问题的最大值作为最终结果。

3、动态规划解法

3.1 辅助函数

首先实现一个标准的打家劫舍函数,处理线性排列的房屋:

introbLinear(int* nums,int start,int end){int prev =0, curr =0;for(int i = start; i < end; i++){int temp = curr; curr =(prev + nums[i]> curr)? prev + nums[i]: curr; prev = temp;}return curr;}

3.2 主函数

处理环形排列的情况:

introb(int* nums,int numsSize){if(numsSize ==0)return0;if(numsSize ==1)return nums[0];// 两种情况:不偷第一间或不偷最后一间int option1 =robLinear(nums,0, numsSize -1);int option2 =robLinear(nums,1, numsSize);return(option1 > option2)? option1 : option2;}

4、代码解析

  1. 边界条件处理
    • 空数组返回0
    • 只有一间房屋直接返回该房屋金额
  2. 分解问题
    • option1:不偷最后一间房屋(即考虑从第1间到倒数第2间)
    • option2:不偷第一间房屋(即考虑从第2间到最后1间)
  3. 动态规划核心
    • prevcurr分别记录前一步和当前的最大金额
    • 对于每间房屋,选择偷或不偷的最大值

5、复杂度分析

  • 时间复杂度:O(n),只需两次线性遍历
  • 空间复杂度:O(1),只使用常数空间

6、测试用例

intmain(){int nums1[]={2,3,2};printf("%d\n",rob(nums1,3));// 输出3int nums2[]={1,2,3,1};printf("%d\n",rob(nums2,4));// 输出4int nums3[]={1,2,3};printf("%d\n",rob(nums3,3));// 输出3return0;}

7、关键点总结

  1. 问题分解:将环形问题分解为两个线性问题
  2. 动态规划:使用标准打家劫舍的解法处理线性情况
  3. 空间优化:只用两个变量存储中间结果,无需完整DP数组
  4. 边界处理:正确处理空数组和单元素数组的情况

8、常见问题解答

Q: 为什么分解为两个子问题?
A: 因为第一间和最后一间不能同时偷,所以要么不偷第一间,要么不偷最后一间。

Q: 如何保证不偷相邻房屋?
A: 动态规划中总是比较偷当前房屋和不偷当前房屋的较大值。

Q: 这个方法能处理所有情况吗?
A: 是的,这种方法能正确处理所有可能的环形排列情况。

Q: 为什么空间复杂度是O(1)?
A: 因为我们只使用了固定数量的变量,没有使用与输入规模相关的额外空间。

面试提示:解释清楚如何将环形问题转化为线性问题,并说明动态规划的状态转移过程,这能展示你对问题的深入理解。
在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺

Read more

C++学习之旅【C++伸展树介绍以及红黑树的实现】

C++学习之旅【C++伸展树介绍以及红黑树的实现】

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法》 《C++知识内容》《Linux系统知识》 ✨逆境不吐心中苦,顺境不忘来时路!🎬 博主简介: 引言:前篇文章,小编已经介绍了关于C++AVL树的实现!相信大家应该有所收获!接下来我将带领大家继续深入学习C++的相关内容!本篇文章着重介绍关于C++伸展树介绍以及红黑树的实现!伸展树与红黑树是两类极具代表性的BBST,且在工程实践中各有不可替代的价值:伸展树摒弃了"严格平衡”的执念,通过“伸展”操作将最近访问的节点移至根节点,利用“局部性原理”优化频繁访问的场景,实现均摊O(logn)的时间复杂度,适合缓存、热点数据查询等场景;红黑树则通过给节点着色并遵守严格的颜色规则,确保树的最长路径不超过最短路径的两倍,以 “弱平衡” 换稳定的最坏O(logn)性能,是C++ STL 中 std::map、std:

By Ne0inhk
C++之unordered_set和unordered_map

C++之unordered_set和unordered_map

一、unordered系列关联式容器  在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log_2 N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好 的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个 unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是 其底层结构不同 1.1 unordered_map  1.2 unordered_map的文档介绍 1. unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。 2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。 3. 在内部, unordered_

By Ne0inhk

YOLOv8 C++部署实战:高性能推理引擎实现

YOLOv8 C++部署实战:高性能推理引擎实现 在智能安防摄像头实时检测行人、工业质检流水线上自动识别缺陷产品,或是自动驾驶车辆感知周围环境的瞬间——这些对响应速度要求极高的场景中,一个高效的视觉推理系统往往决定了整个项目的成败。而在这背后,YOLOv8 正成为越来越多工程师的首选目标检测模型。 但问题也随之而来:Python 训练出的模型虽然开发便捷,却难以满足生产环境中“低延迟、高吞吐”的硬性指标。解释器开销、GIL 锁限制、内存占用高等问题,在边缘设备或服务器集群上尤为突出。于是,将 YOLOv8 模型从 PyTorch 导出,并用 C++ 构建原生推理引擎,便成了通往真正落地的关键一步。 这不仅是一次语言层面的迁移,更是一场性能与可控性的全面升级。 为什么是 YOLOv8? YOLO 系列自诞生以来就以“单次前向传播完成检测”著称,尤其适合需要实时处理的应用。而 YOLOv8 作为 Ultralytics 推出的新一代版本,在保持高精度的同时进一步优化了架构设计和训练流程。 它支持多种任务类型—

By Ne0inhk