LeetCode 1751. 最多可以参加的会议数目 II(DP + 二分查找)
文章目录
- 1. 题目
- 2. 解题
1. 题目
给你一个 events 数组,其中 events[i] = [startDayi, endDayi, valuei]
,表示第 i 个会议在 startDayi 天开始,第 endDayi 天结束,如果你参加这个会议,你能得到价值 valuei 。
同时给你一个整数 k 表示你能参加的最多会议数目。
你同一时间只能参加一个会议。如果你选择参加某个会议,那么你必须 完整 地参加完这个会议。
会议结束日期是包含在会议内的,也就是说你不能同时参加一个开始日期与另一个结束日期相同的两个会议。
请你返回能得到的会议价值 最大和 。
示例 1:
输入:events = [[1,2,4],[3,4,3],[2,3,1]], k = 2
输出:7
解释:选择绿色的活动会议 0 和 1,得到总价值和为 4 + 3 = 7 。
示例 2:
输入:events = [[1,2,4],[3,4,3],[2,3,10]], k = 2
输出:10
解释:参加会议 2 ,得到价值和为 10 。
你没法再参加别的会议了,因为跟会议 2 有重叠。你 不 需要参加满 k 个会议。
示例 3:
输入:events = [[1,1,1],[2,2,2],[3,3,3],[4,4,4]], k = 3
输出:9
解释:尽管会议互不重叠,你只能参加 3 个会议,所以选择价值最大的 3 个会议。提示:
1 <= k <= events.length
1 <= k * events.length <= 10^6
1 <= startDayi <= endDayi <= 10^9
1 <= valuei <= 10^6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be-attended-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
dp[i][k]
表示 遍历完 第 i 个会议,开了k次会,的最大收益- 按结束时间排序
- 对每个 i 会议,二分查找前面最近的 无干涉的会议 j
- 如果不存在,那么就只能开会议 i
- 如果存在,就从 j 转移到 i,枚举 次数
- 还有 i 会议 不参加,就从 i-1 复制过来
class Solution {public:int maxValue(vector<vector<int>>& events, int k) {sort(events.begin(), events.end(),[&](auto a, auto b){return a[1] < b[1];//结束时间排序});int n = events.size();vector<vector<int>> dp(n, vector<int>(k+1, -1));// dp[i][k] 表示 遍历完 第 i 个会议,开了k次会,的最大收益dp[0][0] = 0;dp[0][1] = events[0][2];for(int i = 1; i < n; i++)//转移到i会议,查找之前可以转移过来的j{ // 二分查找时间不冲突的,最晚的结束的会议 jint l = 0, r = i-1, mid, j = n;while(l <= r){mid = l+((r-l)>>1);if(events[mid][1] >= events[i][0])//时间冲突r = mid-1;else{if(mid==n-1 || events[mid+1][1] >= events[i][0]){j = mid;break;}elsel = mid+1;}}// i 会议不开for(int t = 0; t <= k; ++t)dp[i][t] = max(dp[i][t], dp[i-1][t]);// 没有可以转移到 i 的会议if(j == n) //只能开一个会议,idp[i][1] = max(dp[i][1], events[i][2]);else // j 可以转移到 i 会议for(int t = 0; t < k; ++t)//原来开了多少次会{dp[i][t+1] = max(dp[i][t+1], dp[j][t]+events[i][2]);}}int ans = 0;for(int t = 0; t <= k; ++t)ans = max(ans, dp[n-1][t]);return ans;}
};
1764 ms 238.1 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 1751. 最多可以参加的会议数目 II(DP + 二分查找)相关推荐
- LeetCode 1353. 最多可以参加的会议数目(排序+贪心,优先队列,难)
文章目录 1. 题目 2. 解题 2.1 错误解 2.2 超时解 2.3 通过解 2.4 大佬解 1. 题目 给你一个数组 events,其中 events[i] = [startDayi, endD ...
- [leetcode] 5342. 最多可以参加的会议数目
参考:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be-attended/solution/sao-miao- ...
- 最多可以参加的会议数目--贪心算法
LeetCode 最多可以参加的会议数目 给你一个数组 event ,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 en ...
- Leetcode 1353:最多可以参加的会议数目(超详细的解法!!!)
给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi . 你可以在满足 startD ...
- leetcode1353. 最多可以参加的会议数目(贪心算法)
给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi . 你可以在满足 startD ...
- LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)
1. 题目 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多 ...
- leetcode 分享巧克力 java_LeetCode 1231. 分享巧克力(极小极大化 二分查找)
文章目录 1. 题目 2. 解题 1. 题目 你有一大块巧克力,它由一些甜度不完全相同的小块组成.我们用数组 sweetness 来表示每一小块的甜度. 你打算和 K 名朋友一起分享这块巧克力,所以你 ...
- LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)
1. 题目 给你一个整数数组 nums 和一个整数 target . 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目. 由于答案可能很大 ...
- LeetCode 1618. 找出适应屏幕的最大字号(二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 text.并能够在 宽为 w 高为 h 的屏幕上显示该文本. 字体数组中包含按升序排列的可用字号,您可以从该数组中选择任何字体大小. 您可 ...
最新文章
- 清华刘知远组:​让预训练语言模型持续高效吸收新领域知识 | ACL 2022
- mmTrix大数据分析平台构建实录--转
- 微信分享时,描述内容怎么换行
- 全球最强大脑在哪?阿里小蜜算法团队在寻找
- three.js之性能监视器
- mui + vue 模板
- 网站图片全自动加密_11 个值得收藏的在线工具和资源网站
- Vue 实现 Open Graph 分享预览
- (83)FPGA仿真完成激励(finish)
- Laravel 实战视频教程(精品)
- matlab分簇教程,leach分簇算法仿真(基于matlab)
- java对象转换为map
- linux查询文件夹大小
- 图解傅里叶变换(时域频域)
- 体验论文新神器!AMiner人工智能工具,自动溯源论文来龙去脉
- DeepBrain Chain 深脑链——将区块链与AI相结合的前沿科技
- 计算机进制与信息编码,信息与二进制编码
- AutoJs学习-悬浮单任务计时器
- 阵列信号DOA估计系列(一).概述
- 汇编语言程序设计——仿win7计算器(功能部分)