「动态规划」按摩师

力扣原题链接,点击跳转

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列nums,总共有n个预约,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

我们用动态规划的思想解决这个问题。首先创建dp表,确定状态表示,很自然地想到,可以用dp[i]表示一直收到下标为i的请求后,接受的预约的最长总时长。然而,这么想是不够的,因为对于每个预约,都有可能接受或者不接受。所以要分类讨论:用f[i]表示接受下标为i的请求后,接受的预约的最长总时长;用g[i]表示不接受下标为i的请求后,接受的预约的最长总时长。

接着推导状态转移方程。对于f[i],接受了下标为i的预约,说明没有接受下标为i-1的预约,此时接受的预约的最长总时长应为g[i-1]+nums[i]。对于g[i],不接受下标为i的预约,有可能接受了下标为i-1的预约,也有可能不接受下标为i-1的预约,由于要求最长总时长,所以g[i]=max(f[i-1],g[i-1])。

初始化时,只需把f[0]初始化成nums[0],g[0]初始化成0,再从左往右同时填f表和g表。最后,返回max(f[n-1],g[n-1])。

cpp 复制代码
class Solution
{
public:
    int massage(vector<int>& nums)
    {
        int n = nums.size();
        // 处理边界情况
        if (n == 0)
            return 0;
        // 创建dp表
        vector<int> f(n);
        auto g = f;
        // 初始化
        f[0] = nums[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]);
    }
};
相关推荐
香菜大丸5 分钟前
链表的归并排序
数据结构·算法·链表
jrrz08285 分钟前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time17 分钟前
golang学习2
算法
南宫生1 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
Perishell1 小时前
无人机避障——大疆与Airsim中的角速度信息订阅获取
linux·动态规划·无人机
懒惰才能让科技进步2 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara2 小时前
函数对象笔记
c++·算法
泉崎3 小时前
11.7比赛总结
数据结构·算法
你好helloworld3 小时前
滑动窗口最大值
数据结构·算法·leetcode
AI街潜水的八角3 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习