问题描述:一名有名的按摩师会受到源源不断的预约请求,每个预约都可以选择接或者不接,在每次预约服务之间要有休息时间,因此不能接相邻的预约,给定一个请求序列,按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数;
递归方法求解:如果上一个选择了接,则此个预约不能接,如果上一个没有选择接,则这个预约可以选择接或者不接两种选择,使用一个参变量表征上一个是否接客,并在到达最后的时候将结果保存在最大堆中,最后弹出顶上的元素;并使用一个sum保存之前累积的值
public void getMaxTime(int []nums,int index,int isLastChoose,int sum,PriorityQueue<Integer>maxheap)
{
if(inedx==nums.length)
{
maxHeap.add(sum);
return
}
if(isLastChoose)
{
getMaxTime(nums,index+1,false,sum,maxHeap);
}else
{
getMaxTime(nums,index,false,sum,maxHeap);
getMaxTime(nums,index+1,true,sum+prices[index],maxHeap);
}
}
public int GetMaxTime(int [] nums)
{
PriorityQueue<Integer>maxHeap=new PriorityQueue<>(Collections.reverseOrder());
getMaxTime(nums,0,false,0,maxHeap);
return maxHeap.peek();
}
动态规划求解;使用dp[i][0]表征不选择该元素时的前i个元素的最大时间,dp[i][1]表征选择该元素时前i个元素的最大利润;
public int getMaxTime(int []nums)
{
int[][]dp=new int[nums.length][2];
dp[0][0]=0;
dp[0][1]=nums[0];
for(int i=1;i<nums.length;i++)
{
//若不选择当前元素,则上一个元素可以选也可以不选
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]);
//若选择当前元素,则上一个元素只能不选,然后加入num[i]
dp[i][1]=dp[i-1][0]+num[i]
}
return Math.max(dp[nums.length][0],dp[nums.length][1]);}