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]);
    }
};
相关推荐
Z9fish15 小时前
sse哈工大C语言编程练习47
c语言·数据结构·算法
nglff15 小时前
蓝桥杯抱佛脚第一天|简单模拟,set,map的使用
算法·职场和发展·蓝桥杯
愣头不青15 小时前
560.和为k的子数组
java·数据结构
仟濹15 小时前
【算法打卡day27(2026-03-19 周四)】蓝桥云课中Lv.1难度中的绝大部分题
算法·蓝桥杯
罗湖老棍子16 小时前
滑动窗口与双调队列:幕布覆盖问题(定右缩左满分板子)改编自LeetCode 1438
算法·滑动窗口·单调队列
CoovallyAIHub16 小时前
ICLR 2026 | MedAgent-Pro:用 Agent 工作流模拟临床医生的循证诊断过程
深度学习·算法·计算机视觉
实心儿儿16 小时前
算法7:两个数组的交集
算法·leetcode·职场和发展
我可能是个假开发16 小时前
算法-回溯
算法
WolfGang00732116 小时前
代码随想录算法训练营 Day14 | 二叉树 part04
数据结构·算法
爱丽_16 小时前
GC 怎么判定“该回收谁”:GC Roots、可达性分析、四种引用与回收算法
java·jvm·算法