
面试题 17.16. 按摩师
发布日期:2021-05-18 05:02:42
浏览次数:22
分类:精选文章
本文共 1249 字,大约阅读时间需要 4 分钟。
文章目录
动态规划方法解决最大预约时间问题
动态规划详细解法
代码实现
题目描述
本文将详细介绍如何使用动态规划方法解决一个经典问题:给定一系列请求序列,每个请求占用一定的时间,要求在不选择相邻的请求的情况下,找到一个请求序列,使其总预约时间最长。我们将从问题分析、动态规划方法的思路、具体实现代码以及优化思路等方面展开讨论。
方法一:动态规划
思路
使用数组 dp 记录到第i个请求序列为止的最大预约时间。通过对递推关系的分析,可以发现存在以下递推公式:
dp[i] = max(dp[i-1], dp[i-2] + nums[i])
其中,dp[i] 表示截止第i个请求时的最大预约时间。递推关系的意义在于,到达第i个请求时,有两种选择:一种是直接取前一个请求的最大预约时间 dp[i-1];另一种是选择前前一个请求的最大预约时间 dp[i-2],然后加上当前请求的时间 nums[i]。因为不能选择相邻的请求,所以需要这样递推。
初始化:
- 当 nums 为空时,最大预约时间为 0;
- 当 nums 长度为 1 时,最大预约时间为 nums[0];
- 当 nums 长度为 2 时,最大预约时间为 nums[0] 和 nums[1] 中的最大值。
代码
public class Solution { public int massage(vector nums) { int i; vector dp; if (nums.size() == 0) { return 0; } else if (nums.size() == 1) { return nums[0]; } else if (nums.size() == 2) { return max(nums[0], nums[1]); } dp.push_back(nums[0]); dp.push_back(max(nums[0], nums[1])); for (i = 2; i < nums.size(); ++i) { dp.push_back(max(dp[i-1], dp[i-2] + nums[i])); } return dp[i-1]; }}
代码实现
上述代码实现了动态规划的思路。具体来说,代码首先处理了特殊情况,包括 nums 为空、长度为 1 和长度为 2 的情况。对于长度大于等于 3 的情况,代码初始化了 dp 数组,记录每一步的最大预约时间。然后通过遍历 nums 数组,逐步计算每个位置的最大预约时间,最终返回 dp 数组的最后一个元素,即为最终的最大预约时间。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月25日 04时01分32秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python中列表 元组 字典 集合的区别
2019-03-07
Android DEX加固方案与原理
2019-03-07
iOS_Runtime3_动态添加方法
2019-03-07
Leetcode第557题---翻转字符串中的单词
2019-03-07
Problem G. The Stones Game【取石子博弈 & 思维】
2019-03-07
Java多线程
2019-03-07
openssl服务器证书操作
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
我用wxPython搭建GUI量化系统之多只股票走势对比界面
2019-03-07
selenium+python之切换窗口
2019-03-07
重载和重写的区别:
2019-03-07
搭建Vue项目步骤
2019-03-07
账号转账演示事务
2019-03-07
SpringBoot找不到@EnableRety注解
2019-03-07
简易计算器案例
2019-03-07
在Vue中使用样式——使用内联样式
2019-03-07
Explore Optimization
2019-03-07
解决数据库报ORA-02289:序列不存在错误
2019-03-07