一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
注意:本题相对原题稍作改动
 
示例 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.如果今天接受预约,那么昨天就一定没预约,则状态就是dp[i-2] + nums[i].
                              2.如果昨天接受预约,那么今天就不能预约,则状态就是dp[i-1].
最后取两者的最大值表示dp[i]的当前状态,即dp[i] = max(dp[i-2]+nums[i], dp[i-1]).
初始化:如果只有一天则必须接受预约,dp[0] = nums[0].
              如果有两天则判断两天哪天预约最长,dp[1] = max(nums[0],nums[1]).
然后就可以从下标为2一直递推下去,最后只需要输出最后一天的值。
 
因此【动态规划】告诉我们,有些问题可以从最简单的情况考虑,逐步递推,每一步都记住当前问题的答案,即当前最优解。不是直接对问题求解,由于找到了问题最初始的样子,因此在后边的求解过程每一步我们都可以参考之前的结果。
 
 1 int massage(int* nums, int numsSize)
2 {
3 int i;
4 if (numsSize == 0)
5 return 0;
6 if (numsSize == 1)
7 return nums[0];
8
9 int* dp;
10 dp = (int *)malloc(sizeof(int) * numsSize);
11 dp[0] = nums[0];
12 nums[0] > nums[1] ? (dp[1] = nums[0]) : (dp[1] = nums[1]);
13 for (i = 2; i < numsSize; i++)
14 {
15 dp[i] = (nums[i] + dp[i - 2]) > dp[i - 1] ? (nums[i] + dp[i - 2]) : (dp[i - 1]);
16 }
17
18 return dp[numsSize - 1];
19 }
 

DP:按摩师(3.24leetcode每日打卡)的更多相关文章

  1. 【LeetCode】面试题 17.16. 按摩师 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetco ...

  2. leetcode 签到 面试题 17.16. 按摩师 动态规划

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

  3. leetcode面试题 17.16. 按摩师

    leetcode面试题 17.16. 按摩师 又一道动态规划题目 动态规划的核心就是总结出一个通行的方程. 但是这道题似乎不太适合使用递归的方式. 所以使用for循环遍历数组. class Solut ...

  4. P1664 每日打卡心情好

    题目背景 在洛谷中,打卡不只是一个简单的鼠标点击动作,通过每天在洛谷打卡,可以清晰地记录下自己在洛谷学习的足迹.通过每天打卡,来不断地暗示自己:我又在洛谷学习了一天,进而帮助自己培养恒心.耐心.细心. ...

  5. java开发师笔试面试每日8题(1)

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.使用fin ...

  6. java开发师笔试面试每日12题(3)

    1.JDK和JRE的区别是什么? Java运行时环境(JRE)是将要执行Java程序的Java虚拟机.它同时也包含了执行applet需要的浏览器插件.Java开发工具包(JDK)是完整的Java软件开 ...

  7. java开发师笔试面试每日12题(2)

    1.Volatile和Synchronized不同点 (1).volatile只能作用于变量,使用范围较小.synchronized可以用在变量.方法.类.同步代码块等,使用范围比较广. (2).vo ...

  8. java开发师笔试面试每日12题(1)

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被设计 ...

  9. (leetcode每日打卡)秋叶收藏集【动态规划】

    LCP 19.秋叶收藏集 题目链接 算法 动态规划 时间复杂度O(n) 1.题目要求最终形成[红.黄.红]三部分,每部分数量可以不相等,问最终调整操作数量最小是多少.这道题一开始考虑暴力去做,枚举两个 ...

  10. 【LeetCode】2020-03 每日一题

    121. 买卖股票的最佳时机(简单) [分类]:模拟.思维 [题解]:可以用O(n)的复杂度完成,只需要在遍历的时候记录到当前位置为止买入股票的最小价格minn,再维护一个当前卖出股票价(a-minn ...

随机推荐

  1. don't be shy to use reshape

    don't be shy to use reshape

  2. 解读 --- Span<T>

    引言 Span<T> 是C# 中的一种结构体,它是一种内存安全的类型,可以用来表示连续的内存区域.Span<T> 可以被用于访问和操作数组.堆上分配的内存和栈上分配的内存.使用 ...

  3. 三维模型OSGB格式轻量化纹理压缩关键技术分析

    三维模型OSGB格式轻量化纹理压缩关键技术分析 在三维模型应用中,纹理是一个十分重要的因素,可以使得模型更加真实.精细.随着移动设备和网络传输速度的限制,纹理数据也需要进行轻量化处理,而OSGB格式纹 ...

  4. PHP写一个 Api接口需要注意哪些?考虑哪些?

    随着互联网的飞速发展,前后端分离的开发模式越来越流行.编写一个稳定.可靠和易于使用的 API 接口是现代互联网应用程序的关键.本文将介绍在使用 thinkphp6 框架开发 API 接口时需要注意的要 ...

  5. JS遍历Json串并获取Key和Value

    //data为json串 for (var key in data) { console.log(key); console.log(data[key]); }

  6. No manual entry for ls终极解决办法

    No manual entry for ls解决办法,最后一种方法一定能解决你的问题 步骤一:确认man是否已经安装 #which man /usr/bin/man---返回此行,证明已经安装 步骤二 ...

  7. 通过提示大语言模型进行个性化推荐LLM-Rec: Personalized Recommendation via Prompting Large Language Models

    论文原文地址:https://arxiv.org/abs/2307.15780 本文提出了一种提示LLM并使用其生成的内容增强推荐系统的输入的方法,提高了个性化推荐的效果. LLM-Rec Promp ...

  8. Java 21的StringBuilder和StringBuffer新增了一个repeat方法

    发现Java 21的StringBuilder和StringBuffer中多了repeat方法: /** * @throws IllegalArgumentException {@inheritDoc ...

  9. Fortran 的简单入门和使用 OpenMPI

    Fortran 与 C-like 语言的区别简单总结 无大括号,使用关键字画出范围: C++: int main() { } Fortran: program test implicit none e ...

  10. ChatGPT 是如何产生心智的?

    一.前言 - ChatGPT真的产生心智了吗? 来自斯坦福大学的最新研究结论,一经发出就造成了学术圈的轰动,"原本认为是人类独有的心智理论(Theory of Mind,ToM),已经出现在 ...