算法---动态规划练习-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]);
    }
};
相关推荐
星火开发设计7 分钟前
C++ 函数定义与调用:程序模块化的第一步
java·开发语言·c++·学习·函数·知识
天赐学c语言33 分钟前
1.20 - x的平方根 && vector的扩容机制以及删除元素是否会释放内存
c++·算法·leecode
CC.GG1 小时前
【C++】用哈希表封装myunordered_map和 myunordered_set
java·c++·散列表
jiaguangqingpanda1 小时前
Day24-20260120
java·开发语言·数据结构
52Hz1182 小时前
力扣24.两两交换链表中的节点、25.K个一组反转链表
算法·leetcode·链表
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #160:相交链表(双指针法、长度差法等多种方法详细解析)
算法·leetcode·链表·双指针·相交链表·长度差法
ValhallaCoder2 小时前
Day53-图论
数据结构·python·算法·图论
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #84:柱状图中最大的矩形(单调栈、分治法等四种方法详细解析)
算法·leetcode·动态规划·单调栈·分治法·柱状图最大矩形
C雨后彩虹2 小时前
羊、狼、农夫过河
java·数据结构·算法·华为·面试
xiaoye-duck2 小时前
C++ string 类使用超全攻略(上):创建、遍历及容量操作深度解析
c++·stl