1. 解题思路
这一题算是一个比较常规的动态规划的题目吧。
首先,我们将所有的区间进行排序,然后考察每一个区间是否选择的情况,如果不选择,那么直接跳转到下一个位置进行判断,如果选择,那么可选的区间数减一,score加上当前区间的weight,然后我们通过当前区间的终点位置来通过二分查找快速定位到下一个可选的位置继续即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def maximumWeight(self, intervals: List[List[int]]) -> List[int]:
intervals = [[l,r,w,i] for i, (l,r,w) in enumerate(intervals)]
intervals = sorted(intervals)
n = len(intervals)
@lru_cache(None)
def dp(idx, k):
if k == 0 or idx == n:
return 0, []
s1, elems1 = dp(idx+1, k)
l, r, w, i = intervals[idx]
nxt = bisect.bisect_left(intervals, [r+1, r+1, 0, 0])
s2, elems2 = dp(nxt, k-1)
s2, elems2 = s2+w, sorted([i] + elems2)
if s1 > s2 or (s1 == s2 and elems1 < elems2):
return s1, elems1
else:
return s2, elems2
score, elems = dp(0, 4)
return elems
提交代码评测得到:耗时1899ms,占用内存134MB。