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]);
    }
};
相关推荐
鲸渔11 小时前
【C++ 基本数据类型】整型、浮点型、字符型、布尔型及大小
开发语言·c++
淀粉肠kk11 小时前
【C++】C++11 异常
c++
程序员zgh11 小时前
C/C++ 单元测试系统 构建
c语言·开发语言·c++·学习·单元测试
kronos.荒11 小时前
动态规划——01背包问题、完全背包(python、一维DP)
动态规划·背包问题
北顾笙98011 小时前
day20-数据结构力扣
数据结构·算法·leetcode
RTC老炮11 小时前
WebRTC PCC (Performance-oriented Congestion Control) 算法精解
网络·算法·webrtc
bIo7lyA8v11 小时前
算法稳定性分析中的数值误差传播机制的技术5
算法
生信研究猿11 小时前
leetcode 121.买卖股票的最佳时机
算法·leetcode·职场和发展
CoovallyAIHub11 小时前
不需要Memory Bank:CMDR-IAD用2D+3D双分支重建做工业异常检测,MVTec 3D 97.3%
算法·架构·github
AI科技星11 小时前
基于四维速率恒为c公设的北斗GEO卫星昼夜钟差模型修正与实测验证
开发语言·人工智能·线性代数·算法·数学建模