🔗 Link:
📌 Tags:DP
Bitmask
Tutorial
✍🏻 Writer: @SPyofgame
🔎 Editor:
⚒️ Contributor: @ngpin04
📋 Content:
Quy hoạch động tổng tập con, hay DP SOS, là một chủ đề khá mới nhưng đang dần phổ biến trong kỳ thi học sinh giỏi quốc gia môn tin học khi lần đầu được xuất hiện ở bài 3 kỳ VOI 2020.
Cho một mảng gồm các phần tử nguyên ta cần tính được mảng .
Với một tư tưởng đơn giản, ta chỉ cần duyệt qua các , và với mỗi ta sẽ xét qua các tập con trên mảng để cập nhật kết quả . Cụ thể là:
👤Author: @SPyofgame
🏷️Code Tag:Bruteforces
💡Comment: Cách cài đặt bằng vòng lặp trên mọi tập trạng thái.
⏳Time Complexity:
💾Space Complexity:
:::
Với ý tưởng cài cơ bản như vậy, ta đạt được độ phức tạp thời gian và bộ nhớ.
Tất nhiên ta nhận xét là không phải trạng thái nào cũng đáng để duyệt.
Mình chỉ cần quan tâm các mà cập nhật vào .
Với mỗi ta duyệt, ta sẽ xét qua các bằng cách duyệt tập con của .
👤Author: @SPyofgame
🏷️Code Tag:Submask Enumeration
💡Comment: Cách cài đặt bằng vòng lặp trên các trạng thái cần thiết.
⏳Time Complexity:
💾Space Complexity:
Nhìn chung có vẻ chỉ giảm hằng số bằng cách lọc các trường hợp rác, nhưng thực ra độ phức tạp thời gian cũng giảm theo, đó là:
*Ở đây là tập các trạng thái cần xét, cụ thể là .
*Ở đây hàm trả về khi biểu thức đúng và trả về với trường hợp ngược lại.
*Ở đây hàm trả về số bit trong tập trạng thái .
Hay nói một cách đơn giản và dễ hiểu hơn thì, tại mỗi vị trí bit trên tập trạng thái chỉ có trường hợp độc lập nhau, nên số cách tạo ra với vị trí như vậy là . Cụ thể các trường hợp đó là:
và
và
và
*Lưu ý trường hợp thì mọi tập trạng thái có đều là .
Toàn bộ quá trình lặp thì .
Nên ta không cần xét với trường hợp số âm thì nó sẽ làm gì,
Khi thì rõ ràng vòng lặp đã kết thúc hoặc/và trường hợp được xét riêng.
Gọi vị trí bit cuối của là . Thì sẽ lật các bit ở sau thành và lật bit thành .
11110100
thành11110011
(, Lật 2 bit cuối)
?0010010
thành?0010001
(, Lật 1 bit cuối)
???10000
thành???01111
(, Lật 4 bit cuối)
???????1
thành???????0
(, ✦Tức là trong trường hợp bit cuối là thì mệnh đề đúng).
Lưu ý trên tập trạng thái được định nghĩa là đánh số từ bit .
Giá trị sẽ chỉ lấy những giá trị bit là tập con của
Dễ dàng nhận xét được là giá trị sẽ tăng dần và đúng với mọi (từ ✦).
Gọi , với tập chứa các sau khi thay đổi với bit cuối.
Khi , thì không có thay đổi, hay nói cách khác là không được tạo ra tại vị trí do đó
Khi ta có các con được tạo ra là
- Trong đó là khi tồn tại bit trong bit cuối, tức xét toàn bộ của trong vị trí cuối.
- Trong đó là khi toàn bộ bit cuối là , tức xét các toàn bộ sau khi lật bit .
- Nhắc lại, các bit trên tập trạng thái được mặc định là đánh số từ vị trí , cẩn thận nhầm lẫn.
Vậy ta có điều phải chứng minh.
Thay vì duyệt qua toàn bộ submask con để cập nhật kết quả, thì chẳng phải là cũng phải có mối liên hệ gì đó với , do bọn nó lấy tổng dựa trên tập con à ?
Dễ thấy mỗi cập nhật lên các và nhiều lần.
Nếu là các tập con tách ra từ , hay:
Cách đơn giản nhất để tạo mối liên hệ này đó chính là xét
Khi có nghĩa là ta cập nhật nào đó mà có thêm .
Khi có nghĩa là ta cập nhật nào đó mà có thêm .
Tất nhiên ta không cần tới công thức bao hàm loại trừ:
Hay
Mà ta chỉ cần đơn giản hoá như sau
Ta đặt và .
Nhắc lại, ta có quan hệ của với là
thì
thì
Vậy ta có thể đưa bài toán về dạng quy hoạch động
.
là tổng tìm được, ứng với và xét vị trí đầu tiên trong .
Xét và để tìm công thức tương ứng với các .
Khi ta xét
Không khó để suy ra được .
Vì như trên ta đã nói, khi thì , nên .
Lúc này .
Khi ta xét
Trường hợp một, ta có , có giá trị con là .
Trường hợp hai, ta có , có giá trị con là .
Lúc này .
Biểu diễn kiểu tin học là .
Công thức rút gọn như sau:
.
.
Độ phức tạp công thức
Độ phức tạp thời gian: .
Độ phức tạp bộ nhớ: .
Có thể duyệt rồi mới duyệt để giảm bộ nhớ còn .
👤Author: @SPyofgame
🏷️Code Tag:DP SOS
💡Comment: là tổng tìm được, ứng với và xét vị trí đầu tiên trong .
⏳Time Complexity:
💾Space Complexity:
👤Author: @SPyofgame
🏷️Code Tag:DP SOS
,DP Space Saving
💡Comment: Tối ưu bộ nhớ quy hoạch động.
⏳Time Complexity:
💾Space Complexity: