Wiki Kỹ năng giải bài Các dạng bài thường gặp

Các dạng bài thường gặp

huunguyen huunguyen Updated Tháng tư 3, 2026

Nhận biết dạng bài giúp bạn chọn đúng thuật toán ngay từ đầu. Dưới đây là các dạng phổ biến nhất.

1. Bài toán trên mảng/dãy số

Truy vấn đoạn
  • Tổng đoạn [l,r] tĩnh → Prefix sum O(1)/query
  • Tổng đoạn [l,r] + cập nhật điểm → Fenwick Tree O(logN)
  • Tổng / max / min đoạn + cập nhật → Segment Tree O(logN)
Dãy con
  • Dãy con tăng dài nhất → LIS O(NlogN)
  • Tổng dãy con lớn nhất → Kadane's algorithm O(N)
  • Dãy con chung dài nhất → LCS O(NM)
Hai con trỏ (Two Pointers)

Dùng khi tìm cặp/đoạn thỏa điều kiện trên mảng đã sắp xếp:

int l = 0, r = n-1;
while (l < r) {
    if (a[l]+a[r] == target) { /* tìm thấy */ break; }
    if (a[l]+a[r] < target) l++;
    else r--;
}
Sliding Window

Dùng khi tìm đoạn con độ dài K thỏa điều kiện:

// Tổng lớn nhất đoạn độ dài k
long long sum = 0, best = 0;
for (int i = 0; i < n; i++) {
    sum += a[i];
    if (i >= k) sum -= a[i-k];
    if (i >= k-1) best = max(best, sum);
}

2. Bài toán đồ thị

Yêu cầu Thuật toán
Liên thông / đếm thành phần DFS / BFS / DSU
Đường đi ngắn nhất (không trọng số) BFS
Đường đi ngắn nhất (trọng số dương) Dijkstra
Đường đi ngắn nhất (trọng số âm) Bellman-Ford
Đường đi ngắn nhất mọi cặp Floyd-Warshall
Cây khung nhỏ nhất Kruskal / Prim
Thứ tự thực hiện (DAG) Topo sort
Chu trình DFS + màu sắc

3. Bài toán tối ưu (Optimization)

  • Tối ưu có cấu trúc con → DP
  • Lựa chọn tham lam rõ ràng → Greedy
  • Tìm min/max thỏa điều kiện → Binary search trên đáp án

Ví dụ binary search trên đáp án: "In xong N cuốn sách trong D ngày với tốc độ tối thiểu bao nhiêu?" → Binary search trên tốc độ, kiểm tra tính khả thi.


4. Bài toán đếm / tổ hợp

  • Đếm số cách chọn / sắp xếp → Tổ hợp C(n,k)
  • Đếm số cách chia / phân hoạch → DP
  • Đếm cặp thỏa điều kiện → Two pointers hoặc Hash map
  • Đếm nghịch thế → Merge sort hoặc BIT

5. Bài toán xâu chuỗi

Yêu cầu Thuật toán
Tìm pattern trong text KMP / Z-function
So sánh chuỗi con String hashing
Tìm kiếm theo prefix Trie
Palindrome dài nhất Manacher's algorithm

6. Bài toán số học / toán học

  • Chia hết, GCD, LCM → Euclid
  • Số nguyên tố → Sàng / kiểm tra O(N)
  • Lũy thừa lớn → Fast power + modulo
  • Đếm tổ hợp → Precompute factorial
  • Số học đồng dư → Fermat's little theorem

Checklist khi gặp bài mới

[ ] Đọc ràng buộc → xác định O(?) cần thiết
[ ] Brute force được không?
[ ] Bài có dạng quen không? (xem bảng trên)
[ ] Cần sắp xếp trước không?
[ ] Có thể binary search trên đáp án không?
[ ] Bài có cấu trúc con → DP?
[ ] Bài có lựa chọn tham lam → Greedy?
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