一、题目描述

二、解题思路
整体思路
可以采用动态规划的方法来解决这个问题,以i位置为起点:
(1)i==m-1或者i==m-2:最长服务时间为nums[i];
(2)否则,最长的服务时间为nums[i]+max(dp[i+2],...,dp[m-1]);
注意:如果nums.size()==0,直接返回0,如果nums.size()==1,直接返回nums[0]即可。
具体思路
(1)dp[i][j]含义
dp[i]表示为i位置为起点的最长的时间。
(2)状态转移方程
1>i==m-1或者i==m-2:dp[i]=nums[i];
2>否则,dp[i]=Max+nums[i];Max为max(dp[i+2],...,dp[m-1])
(3)初始化
dp[m-1]=nums[m-1],dp[m-2]=nums[m-2];
(4)填写顺序
从后往前开始填写,即从m-3位置往0位置填写。
(5)返回值
由于服务时间均为正数,所以**max(dp[0],dp[1])**即为所求。
三、代码实现
cpp
class Solution {
public:
int massage(vector<int>& nums) {
//dp[i]为以i为起点的最长时间
int m = nums.size();
if(m==0) return 0;
if(m==1) return nums[0];
vector<int> dp(m,0);
int Max = 0;
for(int i=m-1;i>=0;i--){
if(i <= m-3){
Max = max(Max,dp[i+2]);
}
if(i == m-1||i == m-2){
dp[i] = nums[i];
}
else{
dp[i] =Max+nums[i];
}
}
return max(dp[0],dp[1]);
}
};