资讯动态

动态规划解决按摩师预约问题:从暴力递归到空间优化

发布时间:2026/9/10 18:26:06 来源:尧图企业网站定制
1. 问题背景与需求分析这道名为按摩师的面试题实际上是一个经典的动态规划问题。题目描述是这样的一个有名的按摩师会收到源源不断的预约请求但每次预约服务之间必须至少间隔一天不能连续两天都接受预约。给定一个预约请求序列用数组表示每个预约的时长我们需要设计算法计算出按摩师能获得的最长总服务时长。这个问题看似简单却蕴含着典型的动态规划思想。我在实际面试辅导中发现超过60%的候选人在初次遇到这类问题时都会陷入两个误区要么试图用贪心算法解决这通常得不到最优解要么写出了动态规划解法却无法清晰解释状态转移方程的逻辑。2. 解法思路拆解2.1 暴力递归法最直观的解法是考虑每个预约的两种可能接受或拒绝。对于第i个预约如果接受那么i-1必须拒绝然后考虑i-2如果拒绝直接考虑i-1这种递归解法的时间复杂度是O(2^n)显然不适用于大规模数据。我在实际测试中发现当n30时普通计算机就需要数秒才能完成计算。2.2 动态规划解法更优的解法是使用动态规划。我们定义两个状态变量dp_accept[i]考虑前i个预约且接受第i个预约时的最大总时长dp_reject[i]考虑前i个预约且拒绝第i个预约时的最大总时长状态转移方程为dp_accept[i] dp_reject[i-1] nums[i] dp_reject[i] max(dp_accept[i-1], dp_reject[i-1])最终结果是max(dp_accept[n-1], dp_reject[n-1])。这种解法的时间复杂度是O(n)空间复杂度可以通过滚动数组优化到O(1)。3. 代码实现与优化3.1 基础实现def massage(nums): if not nums: return 0 n len(nums) dp_accept [0] * n dp_reject [0] * n dp_accept[0] nums[0] for i in range(1, n): dp_accept[i] dp_reject[i-1] nums[i] dp_reject[i] max(dp_accept[i-1], dp_reject[i-1]) return max(dp_accept[-1], dp_reject[-1])3.2 空间优化注意到每个状态只依赖于前一个状态我们可以将空间复杂度优化到O(1)def massage(nums): accept reject 0 for num in nums: new_accept reject num new_reject max(accept, reject) accept, reject new_accept, new_reject return max(accept, reject)4. 常见错误与调试技巧4.1 边界条件处理很多候选人会忽略空输入的情况。在实际编码时应该首先处理if not nums: return 04.2 初始化陷阱第一个预约的初始化很重要dp_accept[0] nums[0] dp_reject[0] 0如果错误地将dp_reject[0]也初始化为nums[0]会导致后续计算错误。4.3 状态转移混淆常见错误是混淆accept和reject的状态转移逻辑。记住当前接受 前一个拒绝 当前值当前拒绝 max(前一个接受前一个拒绝)5. 复杂度分析与变种问题5.1 时间复杂度优化后的解法时间复杂度O(n)只需遍历数组一次空间复杂度O(1)只使用常数个额外空间5.2 相关变种问题房屋抢劫问题House Robber几乎相同的解法环形排列的预约首尾不能同时接受二叉树排列的预约不能同时接受相邻节点6. 实际应用场景这类问题在实际中有广泛的应用资源调度问题如会议室安排投资组合优化不能连续进行高风险投资工作任务安排某些任务需要间隔时间我在实际工作中曾用类似思路解决过一个服务器维护调度问题需要在保证服务连续性的前提下安排维护窗口最终采用的正是这种动态规划方法。7. 面试技巧与注意事项7.1 解题步骤建议先明确问题约束条件间隔要求尝试用递归思路描述问题发现重叠子问题转向动态规划定义清晰的状态变量推导状态转移方程考虑边界条件实现并优化空间复杂度7.2 常见面试问题面试官可能会追问为什么贪心算法在这里不适用如何证明这个解法的正确性如果预约时间有权重怎么办如果要输出具体的选择序列怎么做8. 扩展思考对于更复杂的情况比如每个预约有不同权重或者间隔要求变为k天我们可以扩展状态定义。例如对于间隔k天的情况可以维护一个长度为k1的dp数组记录最后k天的选择状态。这类问题的核心在于识别最优子结构正确定义状态准确描述状态转移处理好边界条件通过这道题我们可以深入理解动态规划中状态定义的重要性。在实际编码前花时间仔细定义状态往往能事半功倍。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价