算法---动态规划练习-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]);
    }
};
相关推荐
这儿有一堆花15 分钟前
比特币:固若金汤的数字堡垒与它的四道防线
算法·区块链·哈希算法
客卿12321 分钟前
力扣100-移动0
算法·leetcode·职场和发展
多吃蔬菜!!!3 小时前
排序算法C语言实现
数据结构
零叹3 小时前
篇章六 数据结构——链表(二)
数据结构·链表·linkedlist
CM莫问3 小时前
<论文>(微软)WINA:用于加速大语言模型推理的权重感知神经元激活
人工智能·算法·语言模型·自然语言处理·大模型·推理加速
计信金边罗5 小时前
是否存在路径(FIFOBB算法)
算法·蓝桥杯·图论
MZWeiei5 小时前
KMP 算法中 next 数组的构建函数 get_next
算法·kmp
Fanxt_Ja7 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
luofeiju7 小时前
行列式的性质
线性代数·算法·矩阵
緈福的街口7 小时前
【leetcode】347. 前k个高频元素
算法·leetcode·职场和发展