Leetcode 1235. Maximum Profit in Job Scheduling (python)

这篇博客介绍了如何解决LeetCode上的1235题——工作调度的最大利润。作者提供了两种解决方案:动态规划和动态规划结合二分搜索。解法1通过排序区间并使用dp数组来跟踪从前i个区间中选取的最大利润。解法2在解法1的基础上引入二分搜索,提高了大数据规模下的效率。在二刷的过程中,作者指出了初始解法的时间复杂度问题,并阐述了如何调整dp状态转移方程以实现二分搜索,将问题转化为背包问题。
摘要由CSDN通过智能技术生成

Leetcode 1235. Maximum Profit in Job Scheduling

题目

在这里插入图片描述

解法1:dp

这倒题目用dp来做是挺明显的,但是dp的元素代表什么很关键。如果dp元素代表时间的话,那这个题目就很难做了。正确的做法应该是用区间来代表dp的元素,这样就变成了对于每个元素取或者不取两种情况了。具体的解法如下:

  • 将各个区间按照结尾进行排序
  • dp[i]代表从前i个区间中选择,最多可以获取多大的利润
  • 对于第i个区间,分取和不取两种情况
  • 如果取第i个区间,那么需要向前找到j区间,这个区间的结束时间在i区间开始时间之前,这样总理论就等于从前j个区间中取获得的利润加上第i个区间的利润
    状态转移方程
dp[i] = max(dp[i-1],dp[j]+profit_i) where j is the first nonoverlapping interval to i 
class Solution:
    def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[int]) -> int:
        n = len(startTime)
        segments = []
        for i in range(n):
            segments.append([startTime[i],endTime[i],profit[i]])
        
        segments.sort(key=lambda x:x[1])
        
        dp = [0]*n
        for i in range(n):
            # if we don't take i
            if i>0:
                dp[i] = dp[i-1]
            
            # if we take i
            
            for j in range(i-1,-1,-1):
                if segments[j][1]<=segments[i][0]:
                    dp[i] = max(dp[i],dp[j]+segments[i][2])
                    break
            
            # take into count when interval i is the first one
            dp[i] = max(dp[i],segments[i][2])
        
        return dp[-1]

对于最后一行是必须要的,第一个原因是dp[0]需要初始化。另外更重要的原因举个例子,如果第一个区间是[2,3], profit是10,第二个区间是[1,4],profit是100.这个时候dp[0]=10,但是如果没有最后一个比较,dp[1]会是10,而正确的应该是100

解法2:dp+binary search

利用左闭右开寻找第一个符合条件的区间j。关于二分的学习,看这里https://blog.csdn.net/qq_37821701/article/details/108772806

class Solution:
    def jobScheduling(self, startTime: List[int], endTime: List[int], profit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值