Hướng dẫn cho Phần thưởng (Contest Practice VNOI 2021 Round 2)


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: Flower_On_Stone

Xét các cách khi di chuyển từ ô \((i, j)\) qua ô \((u, v)\), \(1\) cách di chuyển được quy ước bời \(2\) số \((x, y)\) nghĩa là \(|i - u| = x, |j - v| = y\).

Sắp xếp và xét lần lượt theo thứ tự tăng của khoảng cách (\(x^{2} + y^{2}\) tăng dần), với mỗi cách \((x, y)\):

  • Gọi \(f(i, j)\) giá trị tối đa của tổng giá trị các ô thỏa mãn tính chất của đề bài, kết thúc tại ô \((i, j)\) và khoảng cách giữa \(2\) ô bất kỳ bé hơn khoảng cách đang xét.

  • Gọi \(g(i, j)\) giá trị tối đa của tổng giá trị các ô thỏa mãn tính chất của đề bài, kết thúc tại ô \((i, j)\) và khoảng cách giữa \(2\) ô bất kỳ bé hơn hoặc bằng khoảng cách đang xét.

  • Khi đó \(g(i, j) = \max(g(i, j), f(i \pm x, j \pm y) + a(x,y))\).

  • Khi xét đến các cuối cùng trong danh sách, hoặc khoảng cách của cách ngay sau khác với cách đang xét ta cập nhật lại f(i, j) = g(i, j)$.

Kết quả trong trường hợp \(s > 0\) sẽ là \(\max(0, f(i, j))\).

Có thể lưu thêm \(1\) mảng tương tự hoặc đảo ngược \(a(i, j) = - a(i, j)\) và tính lại để nhận được đáp án trong trường hợp \(s < 0\).

Đáp án cuối cùng là max trong 2 trường hợp.

Số cách phải xét là \((m \times n)\), với mỗi cách ta duyệt hết cả bảng để cập nhật nên độ phức tạp là \(\mathcal{O}((m \times n)^{2})\).

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.