打卡第24天:按摩师

1. 题目描述

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/the-masseuse-lcci

2. 解题思路

动态规划做这道题再合适不过了,动态规划实际上就是穷举,并且穷举的同时可以把问题分解为子问题,不过同一般穷举比较来看,动态规划使用了DP Table达到了备忘录的作用,能够记录之前可能穷举过的值,尽量避免子问题之间的交叉计算,提高性能。
做动态规划的题的一般思路是先明确状态,状态是我们要解决的问题或者子问题里面变化的量,比如这道题里面,预约人数以及每次预约的时长都是定好了的,所以唯一的变量就是接受多少个预订,那么预订时长就是预订个数对应的时长相加,正好是这道题需要求解的答案;然后是定义DP Table的含义,然后再确定行为,然后明确base case,这样状态转移方程就写出来了。
比如,这道题我们确定时长为状态,然后定义dp[i]为有i个预订的情况下最长预约时长,然后定义行为有接受第i次预订和不接受,base casedp[0]0dp[1]为第一个预订的时长,状态转移方程为dp[i]=max(dp[i-1], dp[i-2]+nums[2]),即在有i个预订的情况下,最长预约时长为如果接受第i个预订,那么时长为dp[i-2]+nums[2],不接受为(dp[i-1]

2.1 代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var massage = function(nums) {
    const len = nums.length
    if (len === 0) return 0
    if (len === 1) return nums[0]
    const dp = new Array(len)
    dp[0] = nums[0]
    dp[1] = Math.max(nums[0], nums[1])
    for (let i = 2; i < len; i++) {
        if (dp[i]) continue
        dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i])
    }
    return dp[len-1]
};

2.2 性能表现

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (欢迎转载,但请注明出处并附带链接)算法好久没复习了,今天看见一妹子在办公室刷Leetcode,顿时我也来了兴趣,...
    Nick_Zuo阅读 688评论 0 3
  • 动态规划方法的关键点 1、最优化原理,也就是最优子结构性质。这指的是一个最优化策略具有这样的性质,不论过去状态和决...
    雨住多一横阅读 549评论 1 0
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 1,522评论 0 2
  • 动态规划 动态规划是一种高性能的牛逼算法,由美国的R.Bellman提出,它是动态就是体现在此算法是基于一个递推公...
    董泽平阅读 1,197评论 0 12
  • LeetCode Dynamic Programming DP 九章DP班归纳: 坐标型DP:保存的是坐标的状态;...
    Deepin_阅读 629评论 0 1