問題描述:一名有名的按摩師會受到源源不斷的預約請求,每個預約都可以選擇接或者不接,在每次預約服務之間要有休息時間,因此不能接相鄰的預約,給定一個請求序列,按摩師找到最優的預約集合(總預約時間最長),返回總的分鐘數;
遞歸方法求解:如果上一個選擇了接,則此個預約不能接,如果上一個沒有選擇接,則這個預約可以選擇接或者不接兩種選擇,使用一個參變量表征上一個是否接客,并在到達最后的時候將結果保存在最大堆中,最后彈出頂上的元素;并使用一個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]);}