Hướng dẫn giải của Mofk Cup Round 2 - COUNTING


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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.

Có thể thấy tổng ~f(s)^2~ chính là số cặp đường đi ~(X, Y)~ sao cho ~s(X) = s(Y)~ (Xâu tạo ra từ đường đi ~X~ giống với xâu tạo ra từ đường đi ~Y~).

Từ đó ta có ý tưởng như sau, gọi ~f(r_1, c_1, r_2, c_2)~ là số cặp đường đi tạo ra xâu giống nhau mà đường đi thứ nhất đang ở ô ~(r_1, c_1)~ và đường đi thứ hai đang ở ô ~(r_2, c_2)~.

Dễ thấy ta có thể đi vào ô ~(r_1, c_1)~ từ ô ~(r_1 - 1, c_1)~ hoặc ~(r_1, c_1 - 1)~. Tương tự có thể đi vào ô ~(r_2, c_2)~ từ ô ~(r_2 - 1, c_2)~ hoặc ~(r_2, c_2 - 1)~. Ta có công thức tính ~f(r_1, c_1, r_2, c_2)~ như sau:

Nếu ~c[r_1][c_1] = c[r_2][c_2]~: ~f(r_1, c_1, r_2, c_2) = f(r_1 - 1, c_1, r_2 - 1, c_2) + f(r_1 - 1, c_1, r_2, c_2 - 1) + f(r_1, c_1 - 1, r_2 - 1, c_2) + f(r_1, c_1 - 1, r_2, c_2 - 1)~

Ngược lại: ~f(r_1, c_1, r_2, c_2) = 0~

Với công thức quy hoạch động như trên ta có thể tính ~f~ với độ phức tạp ~O((m \times n)^2)~

Dễ thấy để hai xâu bằng nhau thì trước hết phải có cùng độ dài nên ta chỉ cần xét các căp ~(r_1, c_1)~ và ~(r_2, c_2)~ mà ~r_1 + c_1 = r_2 + c_2~. Từ đây ta có thể bỏ một chiều của ~f~, ví dụ ta chỉ cần lưu ~f(r_1, c_1, r_2)~ vì có thể tính ~c_2 = r_1 + c_1 - r_2~ . Bằng cách này độ phức tạp giảm xuống còn ~O(m \times n \times min(m, n))~.


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.