「动态规划」按摩师

力扣原题链接,点击跳转

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列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]);
    }
};
相关推荐
abluckyboy5 分钟前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异10 分钟前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_7066532312 分钟前
分布式系统安全通信
开发语言·c++·算法
天天爱吃肉82181 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
alphaTao1 小时前
LeetCode 每日一题 2026/2/2-2026/2/8
算法·leetcode
甄心爱学习1 小时前
【leetcode】判断平衡二叉树
python·算法·leetcode
颜酱2 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
不知名XL2 小时前
day50 单调栈
数据结构·算法·leetcode
@––––––2 小时前
力扣hot100—系列2-多维动态规划
算法·leetcode·动态规划
xsyaaaan2 小时前
代码随想录Day31动态规划:1049最后一块石头的重量II_494目标和_474一和零
算法·动态规划