Hướng dẫn thuật toán

Trùm CUỐI 2026-01-11 11:00:29

Link bài tập

1. Phân tích bài toán

  • Yêu cầu: Đếm số cách di chuyển từ ô (1, 1) đến (H, W) .
  • Quy tắc di chuyển: Chỉ được đi sang phải hoặc xuống dưới.
  • Ràng buộc: Không được đi vào ô có vật cản (#). Vì kết quả rất lớn nên cần lấy dư cho 10^9 + 7 .
  • Nhận xét: Số cách để đến ô (i, j) phụ thuộc trực tiếp vào số cách đã đến các ô trước đó (ô bên trái và ô phía trên). Đây là dấu hiệu điển hình của bài toán Quy hoạch động.

2. Ý tưởng thuật toán

Sử dụng một bảng phương án dp[H][W] , trong đó dp[i][j] lưu trữ số cách đi từ ô (1, 1) đến ô (i, j) .

  • Trạng thái: dp[i][j] là số cách đến ô ở hàng i , cột j .
  • Trường hợp cơ sở: dp[1][1] = 1 (có 1 cách duy nhất để bắt đầu tại điểm xuất phát).
  • Công thức truy hồi:
    • Nếu ô (i, j) là vật cản (#): dp[i][j] = 0 .
    • Nếu ô (i, j) là ô trống (.):

      dp[i][j] = (dp[i-1][j] + dp[i][j-1]) \pmod{10^9 + 7}

      (Trong đó dp[i-1][j] là số cách đi từ phía trên xuống và dp[i][j-1] là số cách đi từ bên trái sang).

3. Các bước thực hiện

  1. Khởi tạo mảng 2 chiều dp kích thước (H+1) \times (W+1) với tất cả giá trị bằng 0.
  2. Đặt dp[1][1] = 1 .
  3. Sử dụng hai vòng lặp lồng nhau để duyệt qua từng ô (i, j) của lưới từ hàng 1 đến H và cột 1 đến W :
    • Nếu là ô (1, 1) , bỏ qua (vì đã khởi tạo).
    • Nếu ô hiện tại là #, đặt dp[i][j] = 0 .
    • Nếu ô hiện tại là ., tính dp[i][j] bằng tổng của ô phía trên và ô bên trái.
    • Lưu ý: Luôn thực hiện phép chia lấy dư % (10^9 + 7) sau mỗi phép cộng để tránh tràn số.
  4. Kết quả cuối cùng nằm tại dp[H][W] .

4. Lưu ý khi triển khai

  • Xử lý biên: Khi tính dp[i][j] , nếu i=1 thì không có ô phía trên, nếu j=1 thì không có ô bên trái. Bạn có thể khởi tạo mảng dư ra 1 hàng và 1 cột (chỉ số 0) toàn số 0 để tránh phải kiểm tra điều kiện biên trong vòng lặp.
  • Kiểu dữ liệu: Trong C++, nên dùng kiểu long long cho mảng dp để tránh tràn số tạm thời khi cộng hai giá trị trước khi lấy dư.
  • Độ phức tạp:
    • Thời gian: O(H \times W) (khoảng 10^6 phép tính, hoàn toàn đáp ứng thời gian 1s).
    • Không gian: O(H \times W) để lưu bảng DP.