面试题 17.16. 按摩师 - 力扣(LeetCode)面试题 17.16. 按摩师 - 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动 示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 2:输入: [2,7,9,3,1]输出: 12解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。示例 3:输入: [2,1,4,5,3,1,1,3]输出: 12解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。https://leetcode.cn/problems/the-masseuse-lcci/
题目描述
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求数组,代表每个预约的时长,请计算按摩师在不接相邻预约的前提下,可以接的最长总时长。
等价题目:打家劫舍,不能选取相邻元素,求选取元素最大和。
思路分析
动态规划核心:划分状态。
fx[i]:第 i 个预约选择接时,前 i 个预约最大总时长gx[i]:第 i 个预约选择不接时,前 i 个预约最大总时长
如果接第 i 个预约:i‑1 一定不能接,只能取 i‑1 不接的结果,再加上当前预约时长
如果不接第 i 个预约:i‑1 可以接,也可以不接,取两者最大值
初始化(i=0,第一个预约)
- 接第一个预约:
fx[0] = nums[0] - 不接第一个预约:
gx[0] = 0
最后结果:到最后一天,接或者不接,两者取最大值
class Solution { public: int massage(vector<int>& nums) { int n=nums.size(); if(n==0) return 0; // fx表示该位置接,gx表示该位置不接 vector<int>fx(n,0); vector<int> gx(n,0); // 初始化 fx[0]=nums[0]; gx[0]=0; for(int i=1;i<n;i++) { fx[i]=nums[i]+gx[i-1]; gx[i]=max(fx[i-1],gx[i-1]); } return max(fx[n-1],gx[n-1]); } };