C算法-动态规划

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);
}

猜你喜欢

转载自blog.csdn.net/weixin_45554139/article/details/105070777
今日推荐