Hướng dẫn giải của Ký Ức Vụn Vỡ
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng tiếp cận
Bài toán yêu cầu tìm đường đi có trọng số lớn nhất trong DAG sao cho dãy ký tự trên đường đi tạo thành palindrome. Ta kết hợp DP trên DAG với ràng buộc palindrome bằng cách duy trì trạng thái hai đầu.
Nhận xét quan trọng
Palindrome mở rộng từ giữa ra ngoài: Một palindrome có thể được xây dựng bằng cách bắt đầu từ trung tâm (1 ký tự cho palindrome lẻ, 2 ký tự giống nhau cho palindrome chẵn) rồi mở rộng bằng cách thêm cùng một ký tự ở cả hai đầu.
Trạng thái DP hai đầu: Ta định nghĩa là trọng số lớn nhất của một đường đi palindrome bắt đầu tại đỉnh và kết thúc tại đỉnh . Khi mở rộng, ta thêm một đỉnh trước và một đỉnh sau với điều kiện .
Tính đúng đắn trên DAG: Vì đồ thị là DAG, mọi đường đi đều không lặp đỉnh. Khi mở rộng thành , ta có đứng trước và đứng sau trong thứ tự topo, nên và không thể nằm trên đường đi từ đến .
Thứ tự xử lý: Gán mỗi đỉnh một chỉ số theo thứ tự topo. Trạng thái có "span" = . Ta xử lý các trạng thái theo span tăng dần để đảm bảo mọi trạng thái con đã được tính trước.
Thuật toán
Sắp xếp topo đồ thị DAG. Gán
topo_pos[u]cho mỗi đỉnh .Khởi tạo:
- cho mọi đỉnh (palindrome độ dài 1).
- nếu có cạnh và (palindrome độ dài 2).
Chuyển trạng thái: Duyệt các cặp theo span tăng dần. Với mỗi có :
- Với mỗi cạnh (đỉnh là tiền bối của ) và mỗi cạnh (đỉnh là hậu duệ của ):
- Nếu : cập nhật .
- Với mỗi cạnh (đỉnh là tiền bối của ) và mỗi cạnh (đỉnh là hậu duệ của ):
Đáp án: .
Độ phức tạp
- Thời gian: . Trong trường hợp xấu nhất với cạnh, tổng chuyển trạng thái bị chặn bởi với là bậc trung bình. Với và , bậc trung bình nhỏ nên thuật toán chạy hiệu quả.
- Bộ nhớ: cho bảng DP.
Bình luận