C++ 中的房屋窃贼2025年3月19日 | 阅读 9 分钟 第一个是大家熟悉的动态规划问题 “房屋盗贼”,这在编码面试中经常出现。这个问题涉及一名狡猾的窃贼,他打算偷窃街上不同编号房屋中隐藏的钱财。也就是说,如果同一晚闯入相邻的两栋房屋,房屋中的安全系统就会响起。因此,挑战在于估算窃贼在不触发警报的情况下能够窃取的最大金额。 形式上,这个问题可以描述如下:
这个问题可以看作是对资源分配进行带有约束条件的优化,因为目标通常是尽可能多地获取物品并躲避警报系统,但这相当于抢劫房屋;然而,为了躲避警报系统,不得不跳过。难点在于确定一种策略,该策略能够让你在遵守问题规则的范围内,总共窃取尽可能多的钱。 方法 1:朴素方法房屋盗贼问题的第一个解决方案尝试是使用暴力破解技术。这需要通过某种搜索形式找到所有要抢劫的房屋子集,然后对每个子集的价值求和,并选择具有最高价值且其元素互不相邻的子集。然而,这种方法虽然正确,但正如你将看到的,对于较大的数组,它会变得计算成本高昂且效率低下。
此外,有必要讨论这种方法的空间复杂度。理想情况下,由于解决方案是递归的,空间复杂度将是 O(n),因为递归的最大深度在最坏情况下等于房屋的数量。这会导致大量的内存消耗,尤其是在输入较大时,并且进一步说明了暴力破解方法的低效性。 编码编译并运行输出 Maximum money that can be robbed (Test Case 1): 12 Maximum money that can be robbed (Test Case 2): 4 Maximum money that can be robbed (Test Case 3): 110 Maximum money that can be robbed (Test Case 4): 0 Maximum money that can be robbed (Test Case 5): 41 Maximum money that can be robbed (Test Case 6): 100 方法 2:优化的动态规划方法可以用来解决房屋盗贼问题的优化动态规划方法,远优于朴素方法。朴素方法虽然易于理解,但其弱点是执行时间需要指数级。 动态规划 (DP) 在最小化旅行时间方面似乎优于暴力破解方法,因为它每个子问题只解决一次,并存储其答案以用于解决主问题以及其他子问题。这个算法技术的灵魂,正如其名称所示,在于识别这些子问题并利用最优子结构来迭代地构建解决方案。
编码编译并运行输出 Maximum money that can be robbed (Test Case 1): 12 Maximum money that can be robbed (Test Case 2): 4 Maximum money that can be robbed (Test Case 3): 110 Maximum money that can be robbed (Test Case 4): 0 Maximum money that can be robbed (Test Case 5): 41 Maximum money that can be robbed (Test Case 6): 100 Maximum money that can be robbed (Test Case 7): 4 Maximum money that can be robbed (Test Case 8): 30 Maximum money that can be robbed (Test Case 9): 90 Maximum money that can be robbed (Test Case 10): 200 结论总而言之,房屋盗贼问题 是一种动态规划的优化形式,它在于使用递归解决方案的正确优化。首先,可以通过使用明显的递归函数方法来解决这个问题,该方法看起来相当冗长,而且与其说是查找解决方案的有效方法,不如说具有指数级的时间复杂度。这种方法不能保证处理更大的输入,因此,我们必须寻找一种更有效的算法来解决这个问题。 动态规划为该问题提供了一种更有效的解决方案,因为它通过较小的重叠子问题来构建解决方案并存储它们的答案。因此,通过识别子问题和应用最优子结构,时间复杂度被定义为 O(n),空间复杂度也可以优化为 O(1)。这种优化是通过使用几个变量来存储必要的子问题结果,而不是使用数组来实现的。 通过这种方式,我们可以观察到如何将一个看似计算成本如此高昂的问题转化为一个运行流畅的算法。房屋盗贼问题的动态规划解决方案不仅提供了处理大量输入的计算方法,还很好地说明了理论如何应用于实践。从朴素解决方案到优化解决方案的转变是另一个清楚表明动态规划作为算法设计阶段组织工作的一种方法的观点。 下一主题C++ 中的有害数 |
引言:Paxos 算法是一种基础的共识协议,旨在允许多个系统或节点就单个值达成一致,即使在某些节点可能发生故障或它们之间的消息可能延迟或丢失的情况下也是如此。它在分布式计算中特别有用,...
阅读9分钟
数学通常被描述为自然的通用语言,一个揭示支配我们周围世界的内在模式、结构和关系的系统。在无数令研究人员着迷的数学序列和构造中,帕多万序列以其优雅而脱颖而出...
阅读 15 分钟
Jolly Jumper Sequence 是数学中的一个概念,非常有趣。它完全是关于系列中连续数字之间的绝对差值。如果给定的系列包含从 1 到 n-1 的所有数字...
阅读 8 分钟
在理解 C++ 中虚函数和纯虚函数之间的区别之前,我们应该了解 C++ 中的虚函数和纯虚函数。什么是虚函数?虚函数是在基类中声明的成员函数,可以在派生类中重新定义...
5 分钟阅读
在本文中,我们将讨论 C++ 中的 `putback()` 函数,包括其语法、参数、示例以及许多其他内容。输入流的本质:在深入研究 `putback()` 函数 2 的细节之前,让我们回顾一下 C++ 中输入流的基本概念。在 C++ 的世界里...
5 分钟阅读
在本文中,我们将讨论。阿喀琉斯数是一类整数,在数论方面具有特定特征。事实上,这是一个吸引数学家和计算数论领域大量兴趣的丰富领域。因此,在...。
阅读 4 分钟
这是 <random> 库的一部分,用于模拟 Student's t 分布。在假设检验中经常使用它,因为样本数量通常较小,并且总体方差未知。t 分布,通常称为 Student's t 分布,是……
阅读 4 分钟
在本文中,我们将通过几个示例学习 C++ 中的总汉明距离。不同长度(通常是二进制字符串)的两个字符串之间的不相似性使用称为总汉明距离的矩阵来度量。它测量两个字符串对应位之间的差异...
阅读 4 分钟
替罪羊树是自平衡二叉搜索树,通过在子树失衡时重建子树来维护其操作(如插入、删除和搜索)的效率。与在每次插入或删除后立即使用旋转来维护平衡的 AVL 或红黑树不同,替罪羊树...
阅读 13 分钟
引言 在计算机科学和编程中,经常执行数据操作和重新排序。移至前面 (MTF) 算法是一种有趣的算法,用于重新排序列表中的元素。MTF 是一种简单但有效的方法,可以根据...重新排列元素的顺序。
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India