Hướng dẫn giải của Educational Backtracking: Bể chứa nước


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.

Ta để ý thấy rằng giới hạn ~n, k~ của bài toán rất nhỏ (~1 \le n, k \le 12~), nên khả năng cao việc thực hiện quay lui để tìm ra toàn bộ phương án khả dĩ là hoàn toàn có thể. Gọi mảng ~delta~ là mảng mức tăng khi ta thực hiện quay lui toàn bộ phương án, khi đó ta chỉ cần quay lui để sinh toàn bộ trạng thái mảng ~delta~ thỏa mãn ~\sum delta_i=k~. Ứng với mỗi mảng ~delta~ ấy ta tính mảng chiều cao mới của các cột ~newH_i=h_i+delta_i~.

Khi đó, việc còn lại của chúng ta chỉ là tìm lượng nước tối đa trữ được trong bể trong mỗi trường hợp để tìm ra phương án tối ưu nhất. Việc tìm lượng nước tối đa trữ được có thể được tính bằng cách xác định lượng nước tối đa tại từng cột ~water_i=max(0, min(max(newH[1..i]), max(newH[i..n]))-newH[i])~ và cộng lại để thu được lượng nước cuối cùng.

Thực tế cho thấy thuật toán quay lui như trên sẽ sinh ra ~n+k-1 \choose k~ ~\le~ ~23 \choose 11~ ~\approx 1.35 \cdot 10^6~ trường hợp (điều này được suy ra từ kết quả của bài toán chia kẹo Euler). Điều đó chứng minh rằng việc chạy quay lui toàn bộ trường hợp ở trên là hoàn toàn khả thi trong thời gian cho phép.

Độ phức tạp thuật toán: ~O(\binom{n+k-1}{k} \cdot n)~


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.