「动态规划」按摩师

力扣原题链接,点击跳转

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

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

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

初始化时,只需把f0初始化成nums0,g0初始化成0,再从左往右同时填f表和g表。最后,返回max(fn-1,gn-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]);
    }
};
相关推荐
Lumbrologist11 分钟前
【C++】零基础入门 · 第 13 节:类与对象基础
java·c++·算法
LONGZETECH18 分钟前
软硬协同+故障注入:无人机仿真维修与操控仿真底层算法逻辑拆解
大数据·c语言·算法·3d·unity·无人机
Lsk_Smion21 分钟前
力扣实训 _ [543].二叉树的直径 _ [23].合并K个升序列表
数据结构·算法·leetcode
凯瑟琳.奥古斯特1 小时前
力扣1235:加权区间调度最优解
java·python·算法·leetcode·职场和发展
耶叶1 小时前
餐厅出入最少人数问题:贪心算法
算法·贪心算法
gihigo19981 小时前
基于小波框架与稀疏表示的SAR图像目标识别系统(MATLAB实现)
算法
吴可可1232 小时前
CAD2004自定义实体开发环境配置
c++·算法
装不满的克莱因瓶2 小时前
矩阵的主成分是什么?主成分分析(PCA)又能做什么?
人工智能·线性代数·算法·机器学习·ai·矩阵·pca
大菜菜小个子2 小时前
template<typename T>使用
java·开发语言·算法