Editorial for Educational Backtracking: Bể chứa nước


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

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)~


Comments

Please read the guidelines before commenting.


There are no comments at the moment.