DP:按摩师(3.24leetcode每日打卡)

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
注意:本题相对原题稍作改动
 
示例 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 }
复制代码

 

 
posted @   Xxaj5  阅读(283)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示