news 2026/4/18 12:33:07

day159—动态规划—打家劫舍(LeetCode-198)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day159—动态规划—打家劫舍(LeetCode-198)

题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。

示例 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. 成员变量作用

    • dx:记忆化数组(替代原代码的memo),缓存dfs(i)的计算结果,dx[i] = -1表示该位置未计算,避免重复递归;
    • nums_:类内备份的输入数组,供辅助函数dfs访问,无需递归传参。
  2. 辅助递归函数dfs(i)逻辑

    • 参数i:表示考虑 “从第 0 个到第i个房子” 的范围;
    • 递归边界:i < 0(没有房子可偷),返回 0;
    • 记忆化优化:若dx[i] != -1,说明该子问题已计算过,直接返回缓存值,避免重复递归;
    • 核心状态转移:dx[i] = max(dfs(i-1), dfs(i-2) + nums_[i])
      • 不偷第i个房子:最大金额 =dfs(i-1)(偷前i-1个房子的最大值);
      • 偷第i个房子:最大金额 =dfs(i-2) + nums_[i](偷前i-2个房子的最大值 + 第i个房子的金额);
      • 取两者最大值存入dx[i]缓存,最终返回该值。
  3. 主函数rob逻辑

    • 边界处理:空数组直接返回 0,增强代码健壮性;
    • 初始化:将输入数组备份到nums_,初始化记忆化数组dx(长度为n,初始值 - 1);
    • 启动递归:调用dfs(n-1)(从最后一个房子开始计算),返回最终结果。

关键特点

  • 效率优化:记忆化数组dx将递归的时间复杂度从暴力枚举的O(2n)优化到O(n);
  • 封装性:辅助函数dfs设为类内函数,通过成员变量共享状态,无需传递大量参数;
  • 逻辑清晰:核心是 “选 / 不选第i个房子” 的二选一决策,符合动态规划的状态转移思想。

总结

  1. 核心思路:用记忆化递归缓存子问题结果,通过 “偷 / 不偷当前房子” 的状态转移计算最大金额;
  2. 关键操作:dx数组的缓存是效率核心,避免重复计算相同子问题;
  3. 功能效果:能高效求解打家劫舍问题,时间 / 空间复杂度均为O(n),且代码结构符合 C++ 类编程风格。

函数源码:

#include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int k; string s; char c1, c2; cin >> k; cin >> s >> c1 >> c2; int len = s.length(); int ans = 0; int ct = 0; int a = 0; int xfind = s.find_last_of(c1); int n = count(s.begin(), s.end(), c1); for (int i = a; i <= xfind; i++) { if (s[i] == c1) { ct++; if (ct > n) break; for (int j = i + k - 1; j < len; j++) { if (s[j] == c2) ans++; } } a = s.find(c1, a + 1); } cout << ans << endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 23:18:07

学长亲荐自考必看TOP8 AI论文平台测评对比

学长亲荐自考必看TOP8 AI论文平台测评对比 2026年自考论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着AI技术的不断进步&#xff0c;越来越多的自考生开始借助AI论文平台提升写作效率。然而&#xff0c;面对市场上琳琅满目的工具&#xff0c;如何选择真正适合自…

作者头像 李华
网站建设 2026/4/17 18:15:35

AI技术驱动的文科核心期刊投稿优化方案

8大文科论文查重工具核心对比 排名 工具名称 查重准确率 数据库规模 特色功能 适用场景 1 Aicheck 98% 10亿文献 AI降重、AIGC检测 初稿查重与修改 2 Aibiye 96% 8亿文献 智能改写、格式调整 终稿精细优化 3 秒篇 95% 6亿文献 一键生成降重报告 快速查重…

作者头像 李华
网站建设 2026/4/18 11:04:13

基于Springboot+Vue的乡村信息管理系统(源码+lw+部署文档+讲解等)

课题介绍 本课题针对乡村信息传递分散、事务管理低效、资源整合不足、数据追溯困难等痛点&#xff0c;设计并实现基于SpringbootVue的乡村信息管理系统&#xff0c;构建集政务公开、民生服务、资源管控、数据统计于一体的数字化乡村治理平台。系统以MySQL为数据存储核心&#x…

作者头像 李华
网站建设 2026/4/18 11:05:02

人体设计提示词

人体设计提示词方案 模板&#xff1a;主题&#xff08;主题定位&#xff09; 人体&#xff08;人体形态&#xff09; 色彩&#xff08;色彩策略&#xff09; 背景&#xff08;背景设计&#xff09; 细节&#xff08;细节增强&#xff09; 参数&#xff08;技术参数&#xff09;…

作者头像 李华
网站建设 2026/4/18 8:36:52

2026年浦东新区灵活用工企业推荐榜

好的&#xff0c;作为一名深耕灵活用工领域的资深行业分析师&#xff0c;我将基于专业、客观的视角&#xff0c;为您呈现这份聚焦浦东新区、结构严谨的灵活用工服务商深度测评与排名报告。《【灵活用工】哪家好&#xff1a;2026年浦东新区专业深度测评与排名前五推荐》开篇&…

作者头像 李华