动态规划之二分查找优化

1235. 规划兼职工作

2008. 出租车的最大盈利

1751. 最多可以参加的会议数目 II

 

本篇文章总结「动态规划」结合「二分查找」来一波优化!!

规划兼职工作

题目详情可见 规划兼职工作

其实和「背包问题」很像,关于「背包问题」总结可见 经典动态规划:0-1 背包问题

首先定义一下dp[i]:表示对于前i个兼职,可以获得的最大报酬

对于每个兼职,我们可以选择也可以不选择。当处于第i个兼职时,对应的状态转移方程如下:

dp[i]=max(dp[i1],dp[j]+profit[i])

其中 j 为满足 endTime[j]startTime[i] 的最大值

现在的问题就转化成如何快速找到这个j,先将所有兼职根据endTime递增排序,如下图所示:

3

在有序序列中快速查找一个值,很明显用二分搜索 🔍

下面给出完整代码:

出租车的最大盈利

题目详情可见 出租车的最大盈利

和上一个题目,一模一样,直接给出完整代码:

最多可以参加的会议数目 II

题目详情可见 最多可以参加的会议数目 II

这个题目略微有一点升级!!有一个整数k的限制,表示你能参加的最多会议数目,更像背包问题了!!!

还有一个需要注意的点:不能同时参加一个开始日期与另一个结束日期相同的两个会议,所以 j 为满足 events[j][1]<events[i][0] 的最大值

更新一下dp的定义,这里我们需要使用二维:dp[i][j]表示对于前i个会议,当前最多参与的会议数量为j,可以获得的会议价值最大和

对应的状态转移方程如下:

dp[i][j]=max(dp[i1][j],dp[l][j1]+events[i][2])

下面给出完整代码: