Cho 3 mảng cùng độ dài: deadlines, credits, durations cho các bài tập. Làm tuần tự, phải xong trước deadline (ngày deadline vẫn tính kịp). Bắt đầu ngày 0. Tối ưu tổng credit.
Ví dụ: deadlines=[7,5,10], credits=[8,7,10], durations=[5,4,10] → 10.
Giải thuật (DP sắp xếp theo deadline)
- Gộp và sắp xếp các bài theo
deadlinetăng dần. - DP
dp(i, day): credit max từ bàiitrở đi, hiện tại ở ngàyday. - Chuyển trạng thái: không làm bài
ihoặc làm (nếuday + duration - 1 <= deadline).
Lưu ý: Cần memoization. Độ phức tạp O(n * max_deadline).
Ví dụ minh họa
from functools import lru_cache
class Solution:
def solve(self, deadlines, credits, durations):
jobs = sorted(zip(deadlines, durations, credits))
@lru_cache(None)
def dp(i=0, day=0):
if i >= len(jobs):
return 0
ans = dp(i + 1, day)
deadline, duration, credit = jobs[i]
if day + duration - 1 <= deadline:
ans = max(ans, dp(i + 1, day + duration) + credit)
return ans
return dp()
ob = Solution()
deadlines = [7, 5, 10]
credits = [8, 7, 10]
durations = [5, 4, 10]
print(ob.solve(deadlines, credits, durations)) # Output: 10
Đầu vào / Đầu ra
Input: [7,5,10], [8,7,10], [5,4,10]
Output: 10