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

Combo Trò Chơi

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

Lời giải: Combo Tối Đa

Hướng tiếp cận

Xây dựng Aho-Corasick automaton từ N chuỗi combo, rồi dùng quy hoạch động trên automaton để tìm chuỗi K ký tự (gồm A, B, C) cho điểm tối đa.

Nhận xét quan trọng

  1. Aho-Corasick cho phép khớp tất cả các chuỗi combo đồng thời khi duyệt qua từng ký tự nhấn. Mỗi trạng thái (nút) của automaton đại diện cho một "hậu tố" của chuỗi đã nhấn.
  2. Tại mỗi nút s, giá trị val[s] lưu số combo kết thúc tại đây (bao gồm cả suffix links), được tích lũy khi xây dựng automaton.
  3. Trạng thái DP: dp[k][s] = điểm tối đa khi đã nhấn k phím và đang ở nút s của automaton. Khởi tạo dp[0][0] = 0.
  4. Số nút automaton tối đa: N×|Si|max+1=20×15+1=301.

Thuật toán

  1. Xây trie từ N chuỗi combo, đánh dấu val[node]++ tại nút kết thúc mỗi chuỗi.
  2. Xây suffix links (failure links) bằng BFS (Aho-Corasick build). Khi build, cộng dồn val[u] += val[fail[u]] để tính điểm suffix.
  3. DP: với mỗi bước k từ 0 đến K1, mỗi trạng thái s, thử 3 ký tự A/B/C:
    • Trạng thái tiếp theo: ns = ch[s][c]
    • Điểm mới: dp[k+1][ns] = max(dp[k+1][ns], dp[k][s] + val[ns])
  4. Đáp án: maxsdp[K][s].

Độ phức tạp

  • Thời gian: O(N·L+K·|V|·3) với |V|301 nút, L15 độ dài combo
  • Bộ nhớ: O(K·|V|)

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