DP nén trạng thái
Giới thiệu
DP trạng thái nén là một dạng của quy hoạch động, bằng cách chuyển tập hợp trạng thái thành số nguyên để ghi lại trong trạng thái DP nhằm thực hiện chuyển trạng thái.
Để đạt được độ phức tạp thời gian thấp hơn, thường cần tìm trạng thái có số lượng nhỏ hơn. Phần lớn bài toán sẽ sử dụng trạng thái nhị phân, dùng số nhị phân \(n\) bit để biểu diễn \(n\) trạng thái độc lập hai giá trị.
Sử dụng trạng thái nén thường liên quan đến thao tác bit, xem thêm về thao tác bit tại trang Toán tử bit.
Bài mẫu 1
「SCOI2005」Không xâm phạm lẫn nhau
Trên bàn cờ \(N\times N\) đặt \(K\) quân vua (\(1 \leq N \leq 9, 1 \leq K \leq N \times N\)), sao cho chúng không tấn công lẫn nhau, hỏi có bao nhiêu cách đặt quân.
Quân vua có thể tấn công 8 ô xung quanh nó (trên, dưới, trái, phải, và 4 ô chéo).
Giải thích
Gọi \(f(i,j,l)\) là số cách hợp lệ khi đã xét \(i\) hàng, trạng thái hàng \(i\) là \(j\), và đã đặt \(l\) quân vua trên bàn cờ.
Với trạng thái \(j\), ta dùng số nguyên nhị phân \(sit(j)\) để biểu diễn cách đặt quân vua, bit \(0\) là không đặt, bit \(1\) là có đặt; \(sta(j)\) là số quân vua trong trạng thái đó, tức là số bit \(1\) trong \(sit(j)\). Ví dụ, trạng thái như hình dưới có thể biểu diễn bằng \(100101\) (bit thấp bên trái), \(sit(j)=100101_{(2)}=37, sta(j)=3\).

Gọi trạng thái hàng hiện tại là \(j\), trạng thái hàng trước là \(x\), ta có phương trình chuyển trạng thái: \(f(i,j,l) = \sum f(i-1,x,l-sta(j))\).
Khi xét trạng thái \(x\) của hàng trước, cần đảm bảo không xung đột với trạng thái \(j\) của hàng hiện tại, liệt kê tất cả \(x\) hợp lệ để chuyển trạng thái:
Cài đặt
Mã tham khảo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
Bài mẫu 2
[POI2004] PRZ
Có \(n\) người cần qua cầu, người thứ \(i\) nặng \(w_i\), thời gian qua cầu là \(t_i\). Những người này sẽ chia thành nhiều nhóm, chỉ khi một nhóm qua xong thì nhóm khác mới được qua. Cầu chịu tải tối đa \(W\), hỏi thời gian ngắn nhất để tất cả qua cầu.
\(100\le W \le 400\), \(1\le n\le 16\), \(1\le t_i\le 50\), \(10\le w_i\le 100\).
Giải thích
Dùng \(S\) để biểu diễn một tập con người, \(t(S)\) là thời gian lâu nhất của nhóm \(S\), \(w(S)\) là tổng trọng lượng nhóm \(S\), \(f(S)\) là thời gian ngắn nhất để tất cả \(S\) qua cầu:
Lưu ý không nên liệt kê tập con rồi kiểm tra, mà nên dùng liệt kê tập con, độ phức tạp \(O(3^n)\).
Cài đặt
Mã tham khảo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
Bài tập
Last updated on this page:, Update history
Found an error? Want to help improve? Edit this page on GitHub!
Contributors to this page:OI-wiki
All content on this page is provided under the terms of the CC BY-SA 4.0 and SATA license, additional terms may apply