trang chủ / bài tập / memory / lời giải

Ký Ức Vụn Vỡ

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.
Tác giả: huunguyenhuunguyen

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

  1. 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.

  2. Trạng thái DP hai đầu: Ta định nghĩa dp[u][v] là trọng số lớn nhất của một đường đi palindrome bắt đầu tại đỉnh u và kết thúc tại đỉnh v. Khi mở rộng, ta thêm một đỉnh u trước u và một đỉnh v sau v với điều kiện cu=cv.

  3. 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 (u,v) thành (u,v), ta có u đứng trước uv đứng sau v trong thứ tự topo, nên uv không thể nằm trên đường đi từ u đến v.

  4. Thứ tự xử lý: Gán mỗi đỉnh một chỉ số theo thứ tự topo. Trạng thái (u,v) có "span" = topo_pos[v]topo_pos[u]. 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

  1. Sắp xếp topo đồ thị DAG. Gán topo_pos[u] cho mỗi đỉnh u.

  2. Khởi tạo:

    • dp[u][u]=wu cho mọi đỉnh u (palindrome độ dài 1).
    • dp[u][v]=wu+wv nếu có cạnh uvcu=cv (palindrome độ dài 2).
  3. Chuyển trạng thái: Duyệt các cặp (u,v) theo span tăng dần. Với mỗi (u,v)dp[u][v]0:

    • Với mỗi cạnh uu (đỉnh u là tiền bối của u) và mỗi cạnh vv (đỉnh v là hậu duệ của v):
      • Nếu cu=cv: cập nhật dp[u][v]=max(dp[u][v], dp[u][v]+wu+wv).
  4. Đáp án: maxu,vdp[u][v].

Độ phức tạp

  • Thời gian: O(N2+(u,v) validin\_deg(u)×out\_deg(v)). Trong trường hợp xấu nhất với M cạnh, tổng chuyển trạng thái bị chặn bởi O(N2·d¯2) với d¯ là bậc trung bình. Với N1500M5000, bậc trung bình nhỏ nên thuật toán chạy hiệu quả.
  • Bộ nhớ: O(N2) cho bảng DP.

Bình luận

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

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0