leetcode面试题17.16
一个有名的理发师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替理发师找到最优的预约集合(总预约时间最长),返回总的分钟数。
自己用了个递归,超时了,强行理解下别人的动态规划吧
1、搞一个数组,来放当前i被访问到,那么最大值是多少
2、初始化:如果第2个被占用,那么第0个肯定可以占用
3、来看第三个怎么赋值的:如果前第二个更大就跟它相加,不然就跟前第三个相加。
int massage(int* nums, int numsSize){
if(numsSize == 0) return 0;
if(numsSize == 1) return nums[0];
if(numsSize == 2) return nums[0] > nums[1] ? nums[0] : nums[1];
int* dp = (int*)malloc(sizeof(int) * numsSize);
dp[0] = nums[0];
dp[1] = nums[1];
dp[2] = dp[0] + nums[2];
for(int i=3; i<numsSize; i++){
int max = dp[i-2] > dp[i-3] ? dp[i-2] : dp[i-3];
dp[i] = max + nums[i];
}
return dp[numsSize-1] > dp[numsSize-2] ? dp[numsSize-1] : dp[numsSize-2];
}
垃圾递归如下,只能通过59/69个用例:
int dfs(int *nums, int numsSize, int start, int sum)
{
if (start >= numsSize) {
return sum;
}
if (start == numsSize - 1) {
return sum + nums[start];
}
int a, b;
a = dfs(nums, numsSize, start + 2, sum + nums[start]);
b = dfs(nums, numsSize, start + 3, sum + nums[start + 1]);
if (a > b) {
return a;
}
return b;
}
int massage(int* nums, int numsSize){
if (numsSize == 0) {
return 0;
}
if (numsSize == 1) {
return *nums;
}
return dfs(nums, numsSize, 0, 0);
}