题目描述
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求数组,代表每个预约的时长,请计算按摩师在不接相邻预约的前提下,可以接的最长总时长。
等价题目:打家劫舍,不能选取相邻元素,求选取元素最大和。
思路分析
动态规划核心:划分状态。
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
最后结果:到最后一天,接或者不接,两者取最大值
cpp
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]);
}
};