当前位置: 首页 > news >正文

动态规划(11.按摩师)

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

解法:

状态表示:

对于简单的线性 dp ,我们可以⽤「经验 + 题⽬要求」来定义状态表⽰:

  1. 以某个位置为结尾,巴拉巴拉;
  2. 以某个位置为起点,巴拉巴拉。
这里我们选择比较常用的⽅式,以某个位置为结尾,结合题⽬要求,定义⼀个状态表示:
dp[i] 表示:选择到 i 位置时,此时的最长预约时长。
但是我们这个题在 i 位置的时候,会⾯临「选择」或者「不选择」两种抉择,所依赖的状态需要细分:
  1. f[i] 表示:选择到 i 位置时, nums[i] 必选,此时的最长预约时长;
  2. g[i] 表示:选择到 i 位置时, nums[i] 不选,此时的最长预约时长。
  • 2. 状态转移方程:

因为状态表示定义了两个,因此我们的状态转移方程也要分析两个:

        对于 f[i]
如果 nums[i] 必选,那么我们仅需知道 i - 1 位置在不选的情况下的最长预约时长,然后加上 nums[i] 即可,因此 f[i] = g[i - 1] + nums[i]
        对于 g[i]
如果 nums[i] 不选,那么 i - 1 位置上选或者不选都可以。因此,我们需要知道 i - 1 位置上选或者不选两种情况下的最长时长,因此 g[i] = max(f[i - 1], g[i - 1]) 。
  • 初始化:
这道题的初始化比较简单,因此⽆需加辅助节点,仅需初始化 f[0] = nums[0], g[0] = 0 即可。
  • 填表顺序

根据「状态转移方程」得「从左往右,两个表⼀起填」。

  • 返回值
根据「状态表示」,应该返回 max(f[n - 1], g[n - 1])

代码:

C++:

java:

相关文章:

  • Opencv计算机视觉编程攻略-第五节 用形态学运算变换图像
  • Git团队开发命令总结
  • 数字人训练数据修正解释
  • java 并发编程-ReentrantLock
  • python识别扫描版PDF文件,获取扫描版PDF文件的文本内容
  • 二叉树搜索树与双向链表
  • hackmyvm-flossy
  • AWS用Glue读取S3文件上传数据到Redshift,再导出到Quicksight完整版,含VPC配置
  • Android: Fragment 的使用指南
  • 004 健身房个性化训练计划——金丹期(体态改善)
  • 汇编学习之《数据传输指令》
  • 远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
  • Rust 语言语法糖深度解析:优雅背后的编译器魔法
  • VoIP技术及其与UDP的关系详解
  • 五类线和六类线
  • 洛谷: P1825 [USACO11OPEN] Corn Maze S
  • 揭秘:父子组件之间的传递
  • Redis批量操作详解
  • Scala的基本语法(二)
  • Python第七章03:文件写入操作
  • 网站建设投标文件范本/网络黄页平台网址有哪些
  • 怎么创建网站免费的/百度网站打开
  • 牡丹江做网站建设/全国各城市疫情搜索高峰进度
  • 医药网站建设/网站优化公司排名
  • 网站建设相关知识/淘宝直通车推广怎么做
  • 局域网内做网站/东莞营销推广公司