题目描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7b8018a53e66a4f84fd919b23b528cb7.png)
题目分析
- 本题使用动态规划的方法,关于动态规划的思想入门,可参考这篇文章:动态规划入门,这一篇就够了
- 将动态规划的思想应用在本题中,其实就是找出每个子数组中服务时间取最大的值。通过建立一个二维数组dp[i][j]来保存选择的情况,i代表的是第i+1天的情况,j的取值只有0或者1,代表是否选择接受预约请求。
- i=0时,表示第一天的情况,应该和后面的分类讨论。1<=i<=len-1时,若不选择接受当天的预约,则在前一天选择接受和不接受的总时长中选择大的那一个;若选择接受当天预约,则说明前一天没有选择,直接dp[i-1][0]加上今天的时长就ok
题目解答
class Solution {
public int massage(int[] nums) {
int len=nums.length;
if(len==0) return 0;
if(len==1) return nums[0];
int[][] dp=new int[len][2];
dp[0][0]=0;
dp[0][1]=nums[0];
for(int i=1;i<len;i++){
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]);
dp[i][1]=dp[i-1][0]+nums[i];
}
return Math.max(dp[len-1][0],dp[len-1][1]);
}
}