[Leedcode][JAVA][按摩师][动态规划]

【问题描述】

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动示例 1:输入: [1,2,3,1]
输出: 4
解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。
示例 2:输入: [2,7,9,3,1]
输出: 12
解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。
示例 3:输入: [2,1,4,5,3,1,1,3]
输出: 12
解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。

【解答思路】

1. 动态规划 二维状态变量 由前往后 想清楚每一步

时间复杂度:O(N) 空间复杂度:O(N)

  1. 设计状态
  • dp[i][0] 表示:区间 [0,i] 里接受预约请求,并且下标为 i 的这一天不接受预约的最大时长;
  • dp[i][1] 表示:区间 [0,i] 里接受预约请求,并且下标为 i 的这一天接受预约的最大时长。
  1. 状态转移方程
  • 今天不接受预约:或者是昨天不接受预约,或者是昨天接受了预约,取二者最大值,即:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
  • 今天接受预约:只需要从昨天不接受预约转移而来,加上今天的时常,即:dp[i][1] = dp[i - 1][0] + nums[i]。

3.初始化
dp[0][0] = 0 与 dp[0][1] = nums[0];

 public int massage(int[] nums) {int len = nums.length;if (len == 0) {return 0;}if (len == 1) {return nums[0];}// dp[i][0]:区间 [0, i] 里接受预约请求,并且下标为 i 的这一天不接受预约的最大时长// dp[i][1]:区间 [0, i] 里接受预约请求,并且下标为 i 的这一天接受预约的最大时长int[][] dp = new int[len][2];dp[0][0] = 0;dp[0][1] = nums[0];for (int i = 1; i < len; i++) {dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);dp[i][1] = dp[i - 1][0] + nums[i];}return Math.max(dp[len - 1][0], dp[len - 1][1]);}

优化:状态数组多设置一行,以避免对极端用例进行讨论

public class Solution {public int massage(int[] nums) {int len = nums.length;// dp 数组多设置一行,相应地定义就要改变,遍历的一些细节也要相应改变// dp[i][0]:区间 [0, i) 里接受预约请求,并且下标为 i 的这一天不接受预约的最大时长// dp[i][1]:区间 [0, i) 里接受预约请求,并且下标为 i 的这一天接受预约的最大时长int[][] dp = new int[len + 1][2];// 注意:外层循环从 1 到 =len,相对 dp 数组而言,引用到 nums 数组的时候就要 -1for (int i = 1; i <= len; i++) {dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);dp[i][1] = dp[i - 1][0] + nums[i - 1];}return Math.max(dp[len][0], dp[len][1]);}
}

优化 [滚动数组] 三个变量 时间复杂度:O(N) 空间复杂度:O(1)

public class Solution {public int massage(int[] nums) {int len = nums.length;if (len == 0) {return 0;}if (len == 1) {return nums[0];}// dp[i & 1][0]:区间 [0, i] 里接受预约请求,并且下标为 i 的这一天不接受预约的最大时长// dp[i & 1][1]:区间 [0, i] 里接受预约请求,并且下标为 i 的这一天接受预约的最大时长int[][] dp = new int[2][2];dp[0][0] = 0;dp[0][1] = nums[0];for (int i = 1; i < len; i++) {dp[i & 1][0] = Math.max(dp[(i - 1) & 1][0], dp[(i - 1) & 1][1]);dp[i & 1][1] = dp[(i - 1) & 1][0] + nums[i];}return Math.max(dp[(len - 1) & 1][0], dp[(len - 1) & 1][1]);}
}

​###### 2. 动态规划 一维状态变量 由前往后 想清楚每一步
时间复杂度:O(N) 空间复杂度:O(N)

   public int massage(int[] nums) {int len = nums.length;if (len == 0) {return 0;}if (len == 1) {return nums[0];}// dp[i]:区间 [0, i] 里接受预约请求的最大时长int[] dp = new int[len];//初始化状态dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < len; i++) {// 今天在选与不选中,选择一个最优的dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[len - 1];}

优化 [滚动数组] 三个变量 时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public int massage(int[] nums) {int len = nums.length;if (len == 0) {return 0;}if (len == 1) {return nums[0];}// dp[i % 3]:区间 [0,i] 里接受预约请求的最大时长int[] dp = new int[3];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < len; i++) {// 今天在选与不选中,选择一个最优的dp[i % 3] = Math.max(dp[(i - 1) % 3], dp[(i - 2) % 3] + nums[i]);}return dp[(len - 1) % 3];}
}

【总结】

1.动态规划流程

  • 第 1 步:设计状态
  • 第 2 步:状态转移方程
  • 第 3 步:考虑初始化
  • 第 4 步:考虑输出
  • 第 5 步:考虑是否可以状态压缩

2.动态规划 自底向上 状态转移
[一般编程] 自顶向下
[记忆化递归」随时可能面对新问题

参考链接:https://leetcode-cn.com/problems/the-masseuse-lcci/solution/dong-tai-gui-hua-by-liweiwei1419-8/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转oracle 11g(40):Oracle11g 不区分大小写设定

Cmd>sqlplus / as sysdba Sql>show  parameter sec_case_sensitive_logon parameter sec_case_sensitive_logon的值为“true”说明区分大小写&#xff0c;为“false”说明不区分大小写&#xff0c;当为“true”时执行以下语句 ALTER SYSTEM SET SEC_CASE_SENSITIVE_…

字串转日期

字串转日期 select date_format(concat(trans_recv_date,trans_recv_time),%Y-%m-%d %T.%f) from cc_qrcode_ride_trans limit 10;转载于:https://www.cnblogs.com/huiandong/p/10185591.html

java mtom_java-axis1.4客户端使用Mtom发送文件

我正在尝试将带有axis1.4客户端的文件发送到jaxws服务.我的客户代码如下.System.out.println(service.getCalcImplPort().getFile(new DataHandler(new DataSource() {Overridepublic OutputStream getOutputStream() throws IOException {// TODO Auto-generated method stubr…

[Leedcode][JAVA][第892题][图形题]

【问题描述】 在 N * N 的网格上&#xff0c;我们放置一些 1 * 1 * 1 的立方体。每个值 v grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。请你返回最终形体的表面积。示例 1&#xff1a;输入&#xff1a;[[2]] 输出&#xff1a;10 示例 2&#xff1a;输入&#xf…

玩转oracle 11g(41):rman备份-00554或者04005

Rman备份 补充问题&#xff1a; 在备份的时候出现如下错误&#xff1a; RMAN-00554: 内部恢复管理器程序包初始化失败 RMAN-04005: 目标数据库中存在错误: ORA-01031: 权限不足 脚本用户改成sys即可

hdu4554 A Famous Game 概率期望

题面 题意&#xff1a;n个球&#xff0c;2种颜色&#xff0c;可能有0~n个红球,每种情况的概率相同。现在从箱子里取出了$p$个球&#xff0c;其中有$Q$个是红球,问现在再取一个球是红球的概率为多少&#xff1f;题解&#xff1a;因为0 ~ n的概率相同&#xff0c;所以每个球是红色…

计算机论文搜索技巧【二】

##善用谷歌学术 ####本文以“blockchain”为例 1.创建快讯 当你确定了研究方向时&#xff0c;订阅功能会主动推送相关文章&#xff0c;是被动输入的神器 2.善用“左栏”筛选条件 3.善用文章摘要下“图标”扩展思路 如何下载文章 未完待续…

java学习(128):map类

定义一个汽车类 import java.util.Date; public class Car {private String brand;//品牌private Date createDate;private int housepower;//马力private int speed;//速度public void setBrand(String brand) {this.brand brand;}public String getBrand() {return brand;}…

[From 1.1~1.2]CLR的执行模型

程序集&#xff08;assembly&#xff09;&#xff1a;程序集是抽象概念程序集是一个或多个模块/资源文件的逻辑性分组。其次&#xff0c;程序集是重用&#xff0c;安全性以及版本控制的最小单元。在CLR的世界中&#xff0c;程序集相当于“组件”。公式表达&#xff1a;程序集 …

java学习(129):hashmap的方法

import java.util.Date; public class Car {private String brand;//品牌private Date createDate;private int housepower;//马力private int speed;//速度public void setBrand(String brand) {this.brand brand;}public String getBrand() {return brand;}public Date getC…

[Leedcode][JAVA][第999题][直接考虑题意]

【问题描述】 在一个 8 x 8 的棋盘上&#xff0c;有一个白色车&#xff08;rook&#xff09;。也可能有空方块&#xff0c;白色的象&#xff08;bishop&#xff09;和黑色的卒&#xff08;pawn&#xff09;。它们分别以字符 “R”&#xff0c;“.”&#xff0c;“B” 和 “p”…

计算闰年

#22 计算闰年 能被4整除 但不能被100整除&#xff0c;或者能被400整除 result[] for i in range(1980,2019):if (i%40 and i%100!0) or (i%4000):result.append(i) print(result) 转载于:https://www.cnblogs.com/xiaoxiao075/p/10191584.html

java学习(130):treemap类

public class Department {private String code;//部门编号private String name;//部门名字private int quanity;//部门人员数量public void setCode(String code) {this.code code;}public String getCode() {return code;}public void setName(String name) {this.name nam…

[Leedcode][JAVA][第914题][最大公约数]

【问题描述】 给定一副牌&#xff0c;每张牌上都写着一个整数。此时&#xff0c;你需要选定一个数字 X&#xff0c;使我们可以将整副牌按下述规则分成 1 组或更多组&#xff1a;每组都有 X 张牌。 组内所有的牌上都写着相同的整数。 仅当你可选的 X > 2 时返回 true。示例 …

java学习(131):hashtable

import java.util.Hashtable;//hashtable public class test70 {public static void main(String[] args){Hashtable htnew Hashtable();ht.put("k0","歌谣");ht.put("k1","小白");ht.put("k2","小红");//ht.put…

如何快速在Github找到你想要的东西

众所周知 Github是全球最大的xx交友平台&#xff0c;虽然被收购了。但是不并没有什么影响。 使用Git可以做很多事&#xff0c;在这里不再缀述&#xff0c;上面的资源也是多种多样&#xff0c;应有尽有 对于这样一个平台&#xff0c;我们想快速找到自己需要的资源有什么好办法。…

[Leedcode][JAVA][第820题][字典树][Set]

【问题描述】 给定一个单词列表&#xff0c;我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。例如&#xff0c;如果这个列表是 ["time", "me", "bell"]&#xff0c;我们就可以将其表示为 S "time#bell#" 和 indexes [0, 2…

java学习(132):hashtable使用map替代实体数据

import java.util.*;public class test71 {public static void main(String[] args){Scanner innew Scanner(System.in);System.out.println("请输入学生的信息");List syuListnew ArrayList();//存储所有学生for(int i1;i<3;i){HashMap stuMapnew HashMap();Syst…

spring----06 更多DI知识

一. 延迟初始化 延迟初始化也叫做惰性初始化&#xff0c;指不提前初始化Bean&#xff0c;而是只有在真正使用时才创建及初始化Bean。配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean Spring容器会在创建容器时提前初始化“singl…

[Leedcode][JAVA][第1162题][BFS]

【问题描述】 你现在手里有一份大小为 N x N 的『地图』&#xff08;网格&#xff09; grid&#xff0c;上面的每个『区域』&#xff08;单元格&#xff09;都用 0 和 1 标记好了。其中 0 代表海洋&#xff0c;1 代表陆地&#xff0c;你知道距离陆地区域最远的海洋区域是是哪一…