Hướng dẫn giải của Chia Ba Phần
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.
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.
Lời giải: Chia Kiện Rơm
Hướng tiếp cận
Dùng quy hoạch động (DP) để duyệt tất cả cách chia vật vào 3 nhóm. Trạng thái DP theo dõi tổng của nhóm 2 và nhóm 3; tổng nhóm 1 suy ra từ tổng cả ba.
Nhận xét quan trọng
- Với và , tổng tối đa là . Không gian trạng thái chỉ là — chấp nhận được.
- Không cần lưu vì .
- Dùng hai mảng boolean luân phiên (rolling array) để tiết kiệm bộ nhớ:
good[cur][b2][b3]= có thể đạt trạng thái sau khi xử lý các vật đầu.
Thuật toán
- Tính
total = S_1 + S_2 + ... + S_N. - Khởi tạo
good[0][0][0] = true. - Với mỗi vật (từ 0 đến ): với mỗi trạng thái
(b2, b3)hợp lệ hiện tại, lan chuyển sang:- Đặt vào nhóm 1:
(b2, b3)giữ nguyên. - Đặt vào nhóm 2:
(b2 + S_i, b3). - Đặt vào nhóm 3:
(b2, b3 + S_i).
- Đặt vào nhóm 1:
- Sau khi xử lý hết, duyệt tất cả trạng thái
(b2, b3)hợp lệ, tínhb1 = total - b2 - b3, cập nhật đáp án = .
Độ phức tạp
- Thời gian: với
- Bộ nhớ:
Bình luận