leetcode 面试题17.16 按摩师

一、题目描述

二、解题思路

整体思路

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

(1)i==m-1或者i==m-2:最长服务时间为numsi

(2)否则,最长的服务时间为numsi+max(dpi+2,...,dpm-1);

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

具体思路

(1)dpij含义

dpi表示为i位置为起点的最长的时间。

(2)状态转移方程

1>i==m-1或者i==m-2:dpi=numsi;

2>否则,dpi=Max+numsi;Max为max(dpi+2,...,dpm-1)

(3)初始化

dpm-1=numsm-1,dpm-2=numsm-2

(4)填写顺序

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

(5)返回值

由于服务时间均为正数,所以**max(dp0,dp1)**即为所求。

三、代码实现

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]);
    }
};
相关推荐
无限码力8 分钟前
阿里算法岗 0530笔试真题 - 寻找满足条件的最优子序列
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试真题·阿里算法题
@小阿宝14 分钟前
机器人正向逆向运动学
算法·机器人
小雨下雨的雨16 分钟前
数独算法与求解器鸿蒙PC Electron框架完成深度解析
javascript·人工智能·算法·游戏·华为·electron·鸿蒙系统
HZ·湘怡19 分钟前
数据结构之排序算法 (1)--插入排序
c语言·数据结构·算法·排序算法
ouliten19 分钟前
[Triton笔记7]融合注意力 (Fused Attention)
人工智能·笔记·算法
开源Z19 分钟前
LeetCode 238 · 除自身以外数组的乘积:左右两遍扫描,不用除法
算法·leetcode
雪落漂泊27 分钟前
C++ 继承与多态(下)
开发语言·c++
charlie11451419129 分钟前
通用GUI编程技术——图形渲染实战(四十九)——完全自绘控件架构:状态机与动画
c++·windows·架构·图形渲染
BAGAE30 分钟前
FEC-RS前向纠错编码理论及工程实施研究
c语言·c++·qt·算法·决策树·链表
阿旭超级学得完31 分钟前
Linux基础指令 四(apt,vim,git,cgdb)
linux·服务器·开发语言·数据结构·c++·git·vim