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

按摩师

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

1. 题目解析

题目地址点这里

2. 讲解算法原理


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

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

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

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

    • 对于第 i 天,如果选择预约,则总时长为前一天选择不预约的最大总时长 gi-1 加上第 i 天的预约时长 numsi,即 fi = gi-1 + numsi
    • 对于第 i 天,如果选择不预约,则总时长为前一天选择预约和不预约的最大总时长中的较大值,即 gi = max(fi-1, gi-1)
  5. 最后,返回最后一天选择预约和不预约的最大总时长的较大值,即 max(fn-1, gn-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]);
    }
};
相关推荐
aini_lovee7 分钟前
FMCW雷达测速测距系统(锯齿波 + CFAR检测)
算法
qq_2975746710 分钟前
设计模式系列文章(基础篇第 11 篇):模板方法模式——定义算法骨架,实现代码复用与流程统一
算法·设计模式·模板方法模式
lqqjuly18 分钟前
知识蒸馏:理论、算法与可运行实现
人工智能·深度学习·算法
水上冰石27 分钟前
comfui的sd1.5模型,有多少采样算法,详解每一个采样算法
人工智能·算法
磊 子38 分钟前
STL之deque和list以及两者与vector的对比
开发语言·c++·list
郝学胜_神的一滴42 分钟前
CMake 012:Linux 下动态库与可执行程序的单文件构建
c++·cmake
黎阳之光44 分钟前
视频孪生+空天地水工融合,黎阳之光构建智慧水利监测新范式
大数据·人工智能·物联网·算法·安全
小poop1 小时前
操作符详解:从入门到精通
c++
山上三树1 小时前
C/C++ 高频报错速查表(开发通用版)
c语言·开发语言·c++
cheems95271 小时前
[算法手记] 贪心 爬楼梯问题
算法·贪心算法