力扣题目
解题思路
java代码
力扣题目:
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
示例 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。
解题思路:
1. 确定状态:每次可以选择接待或不接待一位客户。因此,可以使用一个二维数组dp来表示当前到第i位客户时的最长预约时长。dp[i][0]表示不接待第i位客户时的最长预约时长,dp[i][1]表示接待第i位客户时的最长预约时长。
2. 初始状态:初始化dp[0][0]为0,表示第一个客户不接待时的预约时长为0,dp[0][1]为nums[0],表示第一个客户接待时的预约时长为nums[0]。
3. 状态转移方程:根据当前状态的不同选择(接待或不接待),更新下一状态的预约时长。对于第i位客户,如果选择不接待,则当前状态的最长预约时长为前一位客户接待和不接待两种状态中的最大值;如果选择接待,则当前状态的最长预约时长为前一位不接待的状态加上当前客户的预约时长。
4. 最终结果:遍历所有客户后,最终的最长预约时长为dp[len-1][0]和dp[len-1][1]中的较大值,即最后一位客户接待和不接待两种状态下的最长预约时长。
java代码:
package org.example;
public class M1716 {
public static void main(String[] args) {
M1716 a = new M1716();
System.out.println(a.massage(new int[]{2,1,4,5,3,1,1,3}));
}
public int massage(int[] nums) {
int len = nums.length;
if (len == 0 || len == 1) {
return len == 0 ? 0 : nums[0];
}
int[][] dp = new int[len][2];
// 初始值
dp[0][0] = 0; // 第一个客户不接
dp[0][1] = nums[0]; // 第一个客户接
for (int i = 1; i < len; i++) {
// 如果第i个客户不接
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
// 如果第i个客户接了
dp[i][1] = dp[i - 1][0] + nums[i];
}
// 最终返回最长预约时长
return Math.max(dp[len - 1][0], dp[len - 1][1]);
}
}
标签:面试题,预约,len,接待,int,客户,17.16,按摩师,dp
From: https://blog.csdn.net/LIUCHANGSHUO/article/details/139789053