Leetcode daily 20/03/24 按摩师

按摩师

-题目-

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

-示例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-

  • 动态规划。用一个数组rst存放某位置i的最大时长。某位置i的最大时长为rstsi-2(第i-1和第i个相邻,不考虑)个元素的最大值加上nums[i]

\[rsts(i) = \left\{ \begin{aligned} & nums[i] & \mbox{$(i = 0, 1)$} \\ & \max_{0 \le j \le i - 2} \{rsts(j)\} + nums[i] & \mbox{$(i \le 2)$} \\ \end{aligned} \right. \]

-ac代码-

class Solution:
    def massage(self, nums: List[int]) -> int:
        if not nums:
            return 0
        if len(nums) <= 2:
            return max(nums)

        rsts = [0 for _ in range(len(nums))]

        rsts[0] = nums[0]
        rsts[1] = nums[1]

        for i in range(2, len(nums)):
            rsts[i] = max(rsts[:i - 1]) + nums[i]

        return max(rsts)

-复杂度-

  • \(T(n) = O(n^2)\)
  • \(S(n) = O(n)\)
posted @ 2020-03-24 09:04  Sola~  阅读(260)  评论(0编辑  收藏  举报