zoukankan      html  css  js  c++  java
  • DP:按摩师(3.24leetcode每日打卡)

    一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
    注意:本题相对原题稍作改动
     
    示例 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-2] + nums[i].
                                  2.如果昨天接受预约,那么今天就不能预约,则状态就是dp[i-1].
    最后取两者的最大值表示dp[i]的当前状态,即dp[i] = max(dp[i-2]+nums[i], dp[i-1]).
    初始化:如果只有一天则必须接受预约,dp[0] = nums[0].
                  如果有两天则判断两天哪天预约最长,dp[1] = max(nums[0],nums[1]).
    然后就可以从下标为2一直递推下去,最后只需要输出最后一天的值。
     
    因此【动态规划】告诉我们,有些问题可以从最简单的情况考虑,逐步递推,每一步都记住当前问题的答案,即当前最优解。不是直接对问题求解,由于找到了问题最初始的样子,因此在后边的求解过程每一步我们都可以参考之前的结果。
     
     1 int massage(int* nums, int numsSize)
     2 {
     3     int i;
     4     if (numsSize == 0)
     5         return 0;
     6     if (numsSize == 1)
     7         return nums[0];
     8 
     9     int* dp;
    10     dp = (int *)malloc(sizeof(int) * numsSize);
    11     dp[0] = nums[0];
    12     nums[0] > nums[1] ? (dp[1] = nums[0]) : (dp[1] = nums[1]);
    13     for (i = 2; i < numsSize; i++)
    14     {
    15         dp[i] = (nums[i] + dp[i - 2]) > dp[i - 1] ? (nums[i] + dp[i - 2]) : (dp[i - 1]);
    16     }
    17 
    18     return dp[numsSize - 1];
    19 }
     
  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12556842.html
Copyright © 2011-2022 走看看