leetcode 面试题17.16 按摩师

一、题目描述

二、解题思路

整体思路

可以采用动态规划的方法来解决这个问题,以i位置为起点:

(1)i==m-1或者i==m-2:最长服务时间为nums[i];

(2)否则,最长的服务时间为nums[i]+max(dp[i+2],...,dp[m-1]);

注意:如果nums.size()==0,直接返回0,如果nums.size()==1,直接返回nums[0]即可。

具体思路

(1)dp[i][j]含义

dp[i]表示为i位置为起点的最长的时间。

(2)状态转移方程

1>i==m-1或者i==m-2:dp[i]=nums[i];

2>否则,dp[i]=Max+nums[i];Max为max(dp[i+2],...,dp[m-1])

(3)初始化

dp[m-1]=nums[m-1],dp[m-2]=nums[m-2];

(4)填写顺序

从后往前开始填写,即从m-3位置往0位置填写。

(5)返回值

由于服务时间均为正数,所以**max(dp[0],dp[1])**即为所求。

三、代码实现

cpp 复制代码
class Solution {
public:
    int massage(vector<int>& nums) {
        //dp[i]为以i为起点的最长时间
        int m = nums.size();
        if(m==0) return 0;
        if(m==1) return nums[0];
        vector<int> dp(m,0);

        int Max = 0;
        for(int i=m-1;i>=0;i--){
            if(i <= m-3){
                Max = max(Max,dp[i+2]);
            } 
            if(i == m-1||i == m-2){
                dp[i] = nums[i];
            }
            else{
                dp[i] =Max+nums[i];
            }
        }
        return max(dp[0],dp[1]);
    }
};
相关推荐
jimy12 小时前
消息队列Message Queue(MQ),队列链表(queue),消费者,生产者
数据结构·链表
飞Link2 小时前
数据合成中的通用模型蒸馏、领域模型蒸馏和模型自我提升
算法·数据挖掘
CSDN_RTKLIB2 小时前
【字符编码】文本文件与二进制文件
c++·qt
keven-wang2 小时前
嵌入式-POCO C++开源库
开发语言·c++·开源·poco
夏鹏今天学习了吗2 小时前
【LeetCode热题100(80/100)】完全平方数
算法·leetcode·职场和发展
sin_hielo2 小时前
leetcode 3454(扫描线模板题:矩形面积并)
数据结构·算法·leetcode
小则又沐风a2 小时前
数据结构->栈
数据结构
CSDN_RTKLIB2 小时前
【字符编码】编译器解析字符的底层逻辑
c++
地球资源数据云2 小时前
1960年-2024年中国农村居民消费价格指数数据集
大数据·数据库·人工智能·算法·数据集