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

Sinh Vật Huyền Bí

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 chọn đúng K đỉnh trên cây có trọng số cạnh để tối đa hóa tổng khoảng cách giữa tất cả các cặp đỉnh được chọn. Ta sử dụng kỹ thuật DP trên cây kết hợp bài toán ba lô (knapsack on tree).

Nhận xét quan trọng

  1. Phân rã theo cạnh: Tổng khoảng cách giữa tất cả các cặp đỉnh được chọn có thể được phân rã theo từng cạnh. Với mỗi cạnh (u,v) có trọng số w, nếu ta chọn a đỉnh ở phía cây con chứa vKa đỉnh ở phía còn lại, thì cạnh này đóng góp w·a·(Ka) vào tổng khoảng cách (vì có đúng a·(Ka) cặp đỉnh đi qua cạnh này).

  2. Bài toán ba lô trên cây: Khi gộp các cây con, ta cần quyết định phân bổ bao nhiêu đỉnh được chọn vào mỗi cây con — đây chính là bài toán ba lô (knapsack) trên cây.

  3. Độ phức tạp tối ưu: Nếu gộp cây con một cách cẩn thận (theo kích thước cây con đã xử lý), tổng thời gian là O(N·K2) trong trường hợp xấu nhất, nhưng trên thực tế nhanh hơn nhờ ràng buộc kích thước cây con.

Thuật toán

  1. Xây dựng cây từ danh sách cạnh. Chọn đỉnh 1 làm gốc.

  2. DFS từ gốc. Với mỗi đỉnh u, duy trì mảng dp[u][j] = tổng đóng góp tối đa từ các cạnh trong cây con gốc u, khi chọn đúng j đỉnh trong cây con này.

  3. Khởi tạo: Khi đỉnh u chưa có cây con nào được gộp:

    • dp[u][0]=0 (không chọn đỉnh nào)
    • dp[u][1]=0 (chỉ chọn đỉnh u, chưa có cạnh nào đóng góp)
    • dp[u][j]= với j2
  4. Gộp cây con v (với cạnh trọng số w) vào u:

    • Duyệt tất cả các tổ hợp: j đỉnh đã chọn từ phần đã xử lý của u, và a đỉnh chọn từ cây con v.
    • Giá trị mới: dp[j+a]=max(dp[j+a],dp[u][j]+dp[v][a]+w·a·(Ka))
    • Lưu ý: w·a·(Ka) là đóng góp của cạnh (u,v) — có a đỉnh bên cây con vKa đỉnh bên ngoài.
  5. Kết quả: dp[1][K] — giá trị tối đa khi chọn đúng K đỉnh trên toàn bộ cây.

Độ phức tạp

  • Thời gian: O(N·K2) — tại mỗi cạnh, ta duyệt tối đa O(K2) tổ hợp. Với N,K2000, số phép tính tối đa khoảng 8×109 trong trường hợp xấu nhất, nhưng trên thực tế nhanh hơn nhiều nhờ ràng buộc kích thước cây con (tổng tích kích thước khi gộp bị giới hạn bởi O(N·K)).
  • Bộ nhớ: O(N·K)

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