Editorial for Tập hợp đoạn


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: Yunan

Subtask 1: Ta ta đơn giản duyệt qua tất cả các cách lựa chọn tập hợp đoạn và kiểm tra điều kiện đề bài. Độ phức tạp: O(2S.S2) với S là số lượng đoạn [l,r].

Subtask 2: Với K=2, ta có thể xây dựng tập hợp bao gồm một đoạn có độ dài 2 hoặc hai đoạn có độ dài 1. Duyệt qua tất cả các cách chọn tập hợp với độ phức tạp O(N2).

Subtask 3: Ta ưu tiên chọn một đoạn có độ dài 2 hoặc hai đoạn có độ dài 1 có giá trị chi phí lớn nhất. Sắp xếp các đoạn theo chi phí và tìm kết quả. Độ phức tạp: O(N.log(N)).

Subtask 4: Gọi chi phí của đoạn [l,r]f(l,r)=|bral|+|blar|. Quy hoạch động với trạng thái như sau:

Gọi dp[i][j] (1iN, 1jK) là chi phí lớn nhất của tập hợp đoạn từ 1 đến i có tổng độ dài các đoạn bằng j. Ta xây dựng công thức truy hồi sau:

dp[i][j]=max(dp[i1][j],dp[il][jl]+f(il+1,i) với 1lj).

Công thức trên với ý nghĩa: Ta có thể lựa chọn giữa việc giữ nguyên trạng thái i1 trước đó (không sử dụng đoạn kết thúc tại i) hoặc thêm một đoạn độ dài l kết thúc tại i vào tập hợp đã có. Đáp án của bài toán là dp[N][K].

Độ phức tạp: O(N2.K).

Subtask 5: Ta có thể biến đổi cách tính chi phí như sau:

f(l,r)=|bral|+|blar|=max{ar+bral+bl,ar+bralbl,arbr+al+bl,arbr+albl}

Ngoài ra, khi tính dp[i][j], ta quay về so sánh giữa các giá trị dp[il][jl]. Các giá trị này được gọi là giá trị đường chéo khi biểu diễn dp thành một ma trận hai chiều. Các cặp chỉ số (il,jl) này có điểm chung là đều có cùng giá trị ij. Từ đó, cùng với cách biến đổi biểu thức chi phí ở trên, ta có thể duy trì 4 kiểu kết hợp dp[i][j]ai+1+bi+1, dp[i][j]ai+1bi+1, dp[i][j]+ai+1+bi+1dp[i][j]+ai+1bi+1.

Khi đó, để tính dp[i][j] nếu lựa chọn thêm một đoạn độ dài l, ta chỉ cần tìm giá trị lớn nhất trong số 4 cách kết hợp trên.

Độ phức tạp: O(N.K)


Comments