当前位置: 首页 > news >正文

力扣 每日一题 1235. 规划兼职工作【难度:困难,rating: 2022】(动态规划+二分查找)

题目链接

https://leetcode.cn/problems/maximum-profit-in-job-scheduling/

题目来源于:第159场周赛 Q4 rating: 2022

思路

将所有工作按结束时间排序,然后考虑动态规划:

  1. 直接放弃第 i 个工作,那么保持前 i-1 个工作的收益, d p [ i ] = d p [ i − 1 ] 。 dp[i]=dp[i-1]。 dp[i]=dp[i1]
  2. 设法选上第 i 个工作,那么 d p [ i ] = d p [ k ] + p r o f i t [ i ] dp[i]=dp[k]+profit[i] dp[i]=dp[k]+profit[i],其中 k 必须满足 e n d [ k ] < = s t a r t [ i ] end[k]<=start[i] end[k]<=start[i],并且 k 要尽可能大,这样才能让 dp[k] 尽可能大。

遍历一次需要 O ( n ) O(n) O(n),每次二分查找 k 需要 O ( l o g n ) O(logn) O(logn),所以整体复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

代码

// dp[i]=max(dp[i-1],dp[k]+profit[i])
// dp[i-1]就是直接放弃第i个工作,保持前i-1个工作的收益
// k是在第i个工作开始前能够结束的工作编号的最大值(即end[k]<=start[i],k尽可能大)
// dp[k]+profit[i]就是设法加上第i个工作的收益,那么k必须在满足end[k]<=start[i]的前提下尽可能大,dp[k]才能尽可能大
class Solution {
    static const int N=5e4+10;
    int dp[N];
    struct node{
        int st,ed,val;
    }a[N];

public:
    int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {
        int n=startTime.size();
        for(int i=1;i<=n;i++){
            a[i].st=startTime[i-1];
            a[i].ed=endTime[i-1];
            a[i].val=profit[i-1];
        }
        sort(a+1,a+n+1,[](node s1,node s2){return s1.ed<s2.ed;}); // 第三个参数cmp传入匿名函数
        sort(endTime.begin(),endTime.end()); // 注意endTime[i]的下标比a[i].ed的下标少1

        dp[0]=0;
        for(int i=1;i<=n;i++){
            // 满足end[k]<=start[i]的k的最大值,k的范围为[1,i-1]
            // upper_bound找的是 > 的,再 -1 就是 <=,下标还得 +1,所以 -1+1 抵消掉了
            int k=upper_bound(endTime.begin(),endTime.begin()+i-1,a[i].st)-endTime.begin();
            dp[i]=max(dp[i-1],dp[k]+a[i].val);
        }
        return dp[n];
    }
};

相关文章:

  • 数据挖掘-模型的评估(四)
  • 开源远程桌面软件_RustDesk_(可自建远程桌面服务器)
  • 【Django框架】——11 Django模型——02创建模型类
  • 【考研】暨南大学 848 操作系统简答题(2020-2022)
  • docker-compose部署hive、kafka服务
  • @Import注解详解
  • 基于springboot+vue的美食分享网站
  • 动态规划-斐波拉契数列笔记
  • 农民工学CSAPP题目解析-前篇题目解答以及答疑总结
  • HBase系列从入门到精通(二)
  • libusb系列-002-Windows下libusb源码编译
  • 【C++ 科学计算】C++ 矩阵操作运算符
  • 全排列笔记
  • Python环境变量与引包错误
  • Mysql内置函数整理--基础类型函数
  • 【EOS】Cleos基础
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Android 控件背景颜色处理
  • Android开源项目规范总结
  • android图片蒙层
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java深入 - 深入理解Java集合
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • yii2权限控制rbac之rule详细讲解
  • 初识 webpack
  • 对象引论
  • 服务器之间,相同帐号,实现免密钥登录
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 设计模式 开闭原则
  • 思否第一天
  • 线性表及其算法(java实现)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • No resource identifier found for attribute,RxJava之zip操作符
  • ionic异常记录
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • $.proxy和$.extend
  • $L^p$ 调和函数恒为零
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)windows配置JDK环境
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (七)Java对象在Hibernate持久化层的状态
  • (七)Knockout 创建自定义绑定
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 分布式技术比较
  • .net 后台导出excel ,word
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET与 java通用的3DES加密解密方法
  • @ResponseBody
  • [Android]创建TabBar