持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。
题目(已做删减处理)
这里有
n份兼职工作,每份工作预计从startTime[i]开始到endTime[i]结束,报酬为profit[i]。给你一份兼职工作表,包含开始时间startTime,结束时间endTime和预计报酬profit三个数组,请你计算并返回可以获得的最大报酬。如果你选择的工作在时间X结束,那么你可以立刻进行在时间X开始的下一份工作。
分析
相当困难的一道算法题目。我们很容易的分析出这是一道动态规划题目。但是因为涉及到了工作的时间安排,并且不允许同时工作。因此我们也需要考虑到二分算法的加入。因此我们可以这么考虑:
- 将兼职的工作时间,按照结束时间从小到大进行排序,此时我们可以使用dp[i] 表示工作了i份工作后,得到的最大的报酬;
- 对于初始的工作,我们有dp[0]=0:
- 对于接下来的工作,我们可以得到对应的计算公式为:
dp[i]=max(dp[i−1],dp[k]+profit[i−1])
其中 k 表示满足结束时间小于等于第 i−1 份工作开始时间的兼职工作数量,可以通过二分查找获得。
总结
一道特别困难的动态规划题目。说实话,作者也是看了题解,明白中间的流程关系后,才自己解答了这道题目。但是对于刚接入算法的同学来说,着实是太过困难了。
因此,我建议刚学习算法的同学不用话太多的时间浪费在这道题目上。这道题目并不会影响你的面试、笔试成绩。更像是算法竞赛中的第4到题目。