Professional Documents
Culture Documents
Trường hợp p <= 2 có thể thử tay rất dễ (đáp án chỉ từ 0 đến 2), ta sẽ không bàn đến ở đây.
Phần dưới là lời giải cho p = 3.
Để cho đơn giản, ta coi như các số được đánh từ 0..N-1, vòng tròn bắt đầu từ 0 và kết thúc
bằng một trong các số 1, 2, 3.
Gọi F1(x) là số hoán vị của các số từ x..N-1, thỏa mãn điều kiện và bắt đầu ở x, kết thúc ở x+1.
Tương tự có F2(x), F3(x). Ta có thể dễ dàng tính các F khi x = N-1. Làm sao để tính F1(x) dựa
vào các F lớn hơn?
Giả sử ta cần tính F1(0). Một hoán vị P thỏa mãn sẽ trông như thế nào? Có một vài trường hợp
xảy ra:
P = { 0, 2, …, 1 }
P = { 0, 3, …, 2, 1 }
P = { 0, 3, 2, 5, …, 4, 1 }
P = { 0, 3, 6, …, 5, 2, 4, 1 }
Chúng đều có chung một đặc điểm: tồn tại một phần có dạng “x+1, …, x”. Như vậy, công thức
tính F1(x) là:
F1(x) = G1(x+1) + G1(x+2) + G1(x+4) + G1(x+5),
Trong đó G1(x) là số hoán vị của các số từ x..N-1, thỏa mãn điều kiện và bắt đầu ở x+1, kết thúc
ở x.
F1(x) và G1(x) có bằng nhau không? Trong trường hợp không có các ràng buộc (u, v) bổ
sung, hoặc các ràng buộc này có tính 2 chiều, câu trả lời là có. Tuy nhiên rất tiếc bài toán lại
cho ràng buộc (u, v) là một chiều nên ta buộc phải tính G1(x) riêng, với công thức tương tự:
G1(x) = F1(x+1) + F1(x+2) + F1(x+4) + F1(x+5),
Hai công thức trên khác nhau ở chỗ nào? Đừng quên bạn phải kiểm tra xem những số được
điền vào 2 đầu của hoán vị có thỏa mãn hay không (VD phải kiểm tra (0, 2) không bị cấm thì
mới tăng G1(x+1) vào F1(x)).
Tương tự, ta sẽ có cách tính F2(x), F3(x), G2(x), G3(x).
Làm sao để có base case? Backtrack tất cả giá trị F và G với x từ N-6 đến N-1.
Code đã AC (WARNING: /r/codegore) https://pastebin.com/wb1ZqcMh