算法---动态规划练习-7(按摩师)【类似打家劫舍】

按摩师

  • [1. 题目解析](#1. 题目解析)
  • [2. 讲解算法原理](#2. 讲解算法原理)
  • [3. 编写代码](#3. 编写代码)

1. 题目解析

题目地址点这里

2. 讲解算法原理


  1. 首先,给定一个整数数组 nums,其中 nums[i] 表示第 i 天的预约时间长度

  2. 定义两个辅助数组 f 和 g,长度都为 n(n 是数组 nums 的长度)。

    • 数组 f 表示在第 i 天选择预约时的最大总时长。
    • 数组 g 表示在第 i 天选择不预约时的最大总时长。
  3. 初始化数组 f 和 g 的第一个元素:

    • f[0] = nums[0],表示第一天选择预约,总时长为第一天的预约时长
    • g[0] = 0,表示第一天选择不预约,总时长为0
  4. 从第二天开始,从左到右遍历整个数组 nums,计算每一天的最大总时长

    • 对于第 i 天,如果选择预约,则总时长为前一天选择不预约的最大总时长 g[i-1] 加上第 i 天的预约时长 nums[i],即 f[i] = g[i-1] + nums[i]
    • 对于第 i 天,如果选择不预约,则总时长为前一天选择预约和不预约的最大总时长中的较大值,即 g[i] = max(f[i-1], g[i-1])
  5. 最后,返回最后一天选择预约和不预约的最大总时长的较大值,即 max(f[n-1], g[n-1]),其中 n 是数组 nums 的长度。


3. 编写代码

cpp 复制代码
class Solution {
public:
    int massage(vector<int>& nums) {
        int n=nums.size();
        //处理细节
        if(n==0) return 0;

        vector<int> f(n);   
        vector<int> g(n); 
        f[0]=nums[0],g[0]=0;
        for(int i=1;i<n;i++)
        {
            f[i]=g[i-1]+nums[i];
            g[i]=max(f[i-1],g[i-1]);
        } 
        return max(f[n-1],g[n-1]);
    }
};
相关推荐
报错小能手2 分钟前
数据结构 带头节点的双向循环链表
数据结构·算法·链表
Yolo_TvT10 分钟前
数据结构:算法复杂度
数据结构·算法
带土119 分钟前
14. 某马数据结构整理(2)
数据结构
Fcy64819 分钟前
C++ 模版(进阶)(含array解析)
开发语言·c++·stl·array·模版
Minecraft红客21 分钟前
复原大唐3d更新版本
c++·游戏·3d·娱乐
OKkankan25 分钟前
多态概念及使用
开发语言·数据结构·c++·算法
nn在炼金28 分钟前
FlashAttention 1 深度解读:原理、价值、应用与实战
人工智能·算法
lxh011329 分钟前
合并K个升序链表题解
前端·数据结构·链表
WHS-_-202238 分钟前
Channel Estimation for mmWave High-Mobility Systems With 5G New Radio OFDM (I)
算法·5g
.格子衫.42 分钟前
026动态规划之跨步DP——算法备赛
算法·动态规划