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

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

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

🌺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

【扣子Coze教程】“葬经人”动画工作流开源(附提示词)

【扣子Coze教程】“葬经人”动画工作流开源(附提示词)

最近扣子更新了大版本,送了很多积分,根本用不完。 于是我研究了下“葬经人”动画短视频,看能不能用工作流搞定,结果没一会跑通了,那还说啥,直接开源! 接下来就分享这个巨硬核的Coze工作流:一键生成“葬经人”风格动画短视频。 0代码,所有提示词均已给出,按步骤即可轻松复刻。 开始前,先简单介绍下这个“葬经人”博主,靠着清醒人性哲学短视频涨粉几十万,非常牛逼。 工作流完整截图: 节点看着有点多,别被吓到,没有代码,无非就是拖拉拽节点和填几个参数。 分段展示下工作流: 01 制作工作流 (1)登录扣子,创建一个工作流; 地址:https://www.coze.cn/ (2)设置开始节点参数; (3)添加一个大模型节点->重命名为文案生成->设置参数; 提示💡:都是按顺序在前一个节点后面添加(比如这一步添加的大模型连接在开始节点后)

By Ne0inhk

VS Code 编辑器 Git 工具 - 分支操作【保姆级教程】

VS Code 编辑器 Git 工具 - 分支操作 1、查看分支 2、分支提交记录 3、 以当前分支创建并发布分支 发布后 4、 切换分支 1. 切换分支时记得先提交当前分支的代码 2. 点击分支列表中的分支名称即可切换分支 5、 以某分支创建新分支 6、 合并分支 合并成功,branch1-1分支的test1.txt 合并到branch1分支 7、 变基分支 1. 变基操作时确保当前分支的代码已提交 2. 遇到代码冲突时选择适合的合并方式解决代码冲突,这里我选择【保留双方更改】 3. 变基一半不想变基了,放弃更改文件就行,或者进行文件回退重新选择合并方式 变基成功,branch1-1的提交合并到了branch1 8、 重命名分支 1. 重命名分支是命名当前分支 2. 选择重命名分支后一定要发布分支,不然远程分支名称未同步 9、

By Ne0inhk

最近爆火的 OpenClaw Skills 合集开源了!已收录 700+!

在介绍这份令人眼花缭乱的“武器库”之前,先给还不了解 OpenClaw 的朋友补个课。 简单来说,OpenClaw 是目前 GitHub 上最火的本地化 AI Agent 平台(前身是 Clawd/Moltbot)。不同于只能在网页里陪聊的 ChatGPT,OpenClaw 是一个运行在你电脑终端里的“数字管家”。 * 本地优先:直接运行在你的 Mac/Linux/Windows 上,数据不出本地,拥有 Docker 沙箱级安全保护。 * 全渠道接入:你可以通过 WhatsApp、Telegram、Slack 甚至 iMessage 随时指挥它。 * 行动派:它不只是给你建议,而是能直接读写文件、运行命令、调用 API。 如果说 OpenClaw 是一个强悍的操作系统,那么下面要介绍的

By Ne0inhk

Gitee完全新手教程

文章目录 * 🚀 Gitee完全新手教程 * 一、注册与准备 * 二、创建第一个仓库(详细步骤) * 步骤1:点击创建按钮 * 步骤2:填写基础信息 * 步骤3:关键设置 * 步骤4:创建完成 * 三、本地操作指南 * 1. 克隆仓库到本地 * 2. 日常工作流程 * 3. 常用命令总结 * 四、重要概念解释 * 1. 仓库(Repository) * 2. 分支(Branch) * 3. 提交(Commit) * 4. 推送(Push)和拉取(Pull) * 五、新手注意事项 ⚠️ * 🚫 绝对不要做 * ✅ 推荐做法 * 六、.gitignore模板示例 * 七、遇到问题怎么办? * 常见问题解决 * 八、学习路径建议

By Ne0inhk