【学会动态规划】按摩师(11)

目录

动态规划怎么学?

[1. 题目解析](#1. 题目解析)

[2. 算法原理](#2. 算法原理)

[1. 状态表示](#1. 状态表示)

[2. 状态转移方程](#2. 状态转移方程)

[3. 初始化](#3. 初始化)

[4. 填表顺序](#4. 填表顺序)

[5. 返回值](#5. 返回值)

[3. 代码编写](#3. 代码编写)

写在最后:


动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接: 面试题 17.16. 按摩师 - 力扣(Leetcode)

题目不难理解,就是不能选相邻的预约请求,。

最后算出最长的预约时长。

2. 算法原理

1. 状态表示

dp i 表示的是到这个位置的时候的最长预约时长,

但是实际上这里有两种情况,

  1. 到了 i 位置选 i 此时的最长预约时长:我们称之为 f i

  2. 到了 i 位置但是不选 i 此时的最长预约时长:我们称之为 g i

2. 状态转移方程

那这两种情况的状态转移方程是什么呢?

f i = g i - 1 + nums i

g i = max( f i - 1 ,g i - 1 )

3. 初始化

f 0 = nums 0 ,g 0 = 0

4. 填表顺序

从左往右。

5. 返回值

max( f n - 1 ,g n - 1 ),取最后一个位置的两种情况的最大值

3. 代码编写

cpp 复制代码
class Solution {
public:
    int massage(vector<int>& nums) {
        int size = nums.size();
        if(size == 0) return 0;
        vector<int> f(size);
        auto g = f;
        f[0] = nums[0];
        for(int i = 1; i < size; i++) {
            f[i] = g[i - 1] + nums[i];
            g[i] = max(f[i - 1], g[i - 1]);
        }
        return max(f[size - 1], g[size - 1]);
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关推荐
蛋先生DX11 小时前
内存安全翻车现场的罪魁祸首,根源就在这三步里?
c++·后端·编程语言
小七在进步11 小时前
C++入门(1)
java·jvm·c++
晴天的雨.99211 小时前
[C++算法]快乐数
数据结构·c++·算法
孤狼warrior11 小时前
SCTR 五次失败的安全 BN 路由器
人工智能·python·深度学习·算法·安全·yolo
影视飓风TIM11 小时前
C++11 核心新特性完整梳理
数据结构·c++·算法
艾莉丝努力练剑11 小时前
【AI大模型接入SDK】Ollama本地大语言模型部署
c++·人工智能·语言模型·自然语言处理·面试
晴天的雨.99211 小时前
[C++]算法双指针 复写0
数据结构·c++·算法
橘子汽水16811 小时前
Leetcode 128,49最长连续序列,字母异位词分组
java·算法·leetcode
圣保罗的大教堂11 小时前
leetcode 1140. 石子游戏 II 中等
leetcode