首页 > 其他分享 >1751.maximum-number-of-events-that-can-be-attended-ii 最多可以参加的会议数目II

1751.maximum-number-of-events-that-can-be-attended-ii 最多可以参加的会议数目II

时间:2022-12-15 18:34:11浏览次数:70  
标签:attended int mid maximum II vector 1751 events dp

问题描述

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

解题思路

动态规划+二分法
dp[i][j]表示在前i个会议,最多参加j个会议,收获的最大价值:

  • 考虑选择不参加events[i - 1]dp[i][j] = dp[i - 1][j];
  • 选择参加events[i - 1]dp[i][j] = dp[idx][j - 1] + events[i - 1][2];
    • 其中idx表示结束日期小于events[i - 1][0]且最接近events[i - 1][0]的会议的索引号,因此这里需要按照结束日期从小到大对events排序;
    • 寻找idx可以使用二分查找;

二分查找要注意其中的不变量,即l左侧的值都小于targetr右侧的值都大于或等于target(这里是否等于取决于具体实现>=或者>)

代码

class Solution {
  public:
    int maxValue(vector<vector<int>> &events, int k) {
        vector<vector<int>> dp(events.size() + 1, vector<int>(k + 1, 0));
        // 按照会议结束顺序排序
        std::sort(events.begin(), events.end(), [](auto &a, auto &b) { return a[1] < b[1]; });
        // for (int i = 1; i <= events.size(); i++) {
        //     dp[i][1] = events[i - 1][2];
        // }
        for (int i = 1; i <= events.size(); i++) {
            for (int j = 1; j <= k; j++) {
                int tmp1 = dp[i - 1][j]; // 不包含event[i - 1]的情况
                int find_idx = 0;
                int l = 0;
                int r = i - 2;
                for (; l <= r && r >= 0;) {
                    int mid = l + (r - l) / 2;
                    if (events[mid][1] >= events[i - 1][0]) {
                        r = mid - 1;
                        // mid = l + (r - l) / 2;
                    } else {
                        l = mid + 1;
                        // mid = l + (r - l) / 2;
                    }
                }
                // if (l == 0)
                //     dp[i][j] = std::max(tmp1, events[i - 1][2]);
                // else
                dp[i][j] = std::max(tmp1, dp[l][j - 1] + events[i - 1][2]);
            }
        }
        return dp[events.size()][k];
    }
};

标签:attended,int,mid,maximum,II,vector,1751,events,dp
From: https://www.cnblogs.com/zwyyy456/p/16985801.html

相关文章

  • 硬件IIC调试问题排查
    目录沁恒蓝牙系列芯片中目前只有CH582/583以及208包含有硬件IIC外设,本文均使用582进行测试,其他沁恒芯片也可以参考本文排查。先进行“常规”检查,检查相关引脚的焊接、线......
  • IIS功能缺失(没有日志或默认文档)
    我发现我的IIS少了好多功能,但是忘记是哪里设置打开的了,找了很久,发现是在控制面板里面。。。       一个一个仔细打开,把对应的勾上,提交之后就会把这些功能......
  • C# ASCII码字符转换
    C#单纯的字母数字ASCII码转换字母转换成数字byte[]array=newbyte[1];//定义一组数组arrayarray=System.Text.Encoding.ASCII.GetBytes("string");//string为......
  • STPSC20H12WL(二极管)ISM303DACTR磁力计、IIS2MDCTR传感器技术参考
    概述:1、STPSC1200V肖特基碳化硅二极管是一款专门设计用于光伏逆变器的高性能整流器。STPSC能够在高频率下工作,具有低开关损耗和不受温度影响的超快速开关,因此有助于将逆变......
  • 刷题笔记——2758.打印ASCII码 & 2759.打印字符
    题目2758.打印ASCII码2759.打印字符代码whileTrue: try: a=input() print(ord(a)) except: breakwhileTrue: try: a=int(input()) print(chr(a))......
  • net5 debug版本iis发布 403.14 错误
    HTTP错误403.14-Forbidden ASPNETCore5.0VS2022发布好网站部署在IIS上就报错了:HTTP错误403.14-Forbidden这个错误出现的次数很多,也就解决过很多次,在N......
  • 力扣---213. 打家劫舍 II
    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互......
  • How can I get an entiity by id and include navigation
    HowcanIgetanentiitybyidandincludenavigationTogetanentitybyitsIDandincludeitsnavigationproperties,youcanusetheIncludemethodinEnti......
  • 剑指 Offer II 002. 二进制加法
    题目描述二进制加法:给定两个01字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。输入为非空字符串且只包含数字 1 和 0。提示:每个字符串仅由字符......
  • LeetCode80. 删除排序数组中的重复项 II
    给定一个排序数组,你需要在​​原地​​删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在​​原地​​修改输入数组并在......