Hướng dẫn giải của Đường Đi Chi Phí Nhỏ Nhất
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: Đường Đi Chi Phí Nhỏ Nhất
Hướng tiếp cận
Đặt là chi phí nhỏ nhất để đến ô từ .
Công thức truy hồi:
Vì lên đến , không thể lưu toàn bộ mảng . Thay vào đó, ta xử lý từng cột từ trái sang phải và duy trì hàm dưới dạng hàm bậc hai từng đoạn (piecewise quadratic).
Nhận xét quan trọng
Tính lồi (convexity): Với mỗi cột cố định, là hàm lồi theo . Cụ thể, — hiệu sai phân không giảm.
Biểu diễn từng đoạn: Mỗi đoạn của có dạng: trong đó là "cột nguồn" (cột mà ta di chuyển sang phải lần cuối), và là hằng số tích lũy.
Cập nhật sang cột mới: Chuyển từ sang (thêm vào chi phí đi xuống): Đây là "prefix minimum" của một hàm lồi — kết quả vẫn là hàm lồi.
Thuật toán
Duy trì stack các đoạn:
Mỗi phần tử stack lưu (lx, pre_col, k):
lx: hàng bắt đầu của đoạn nàypre_col: cột nguồn (cột di chuyển phải gần nhất)k: hằng số; với
Khi chuyển sang cột mới:
- Lần lượt xóa các đoạn ở đuôi stack nếu chúng bị "thống trị" bởi đoạn mới (đoạn từ việc đi xuống ở cột hiện tại).
- Tìm vị trí breakpoint chính xác bằng tìm kiếm nhị phân.
- Thêm đoạn mới vào stack (tương ứng với việc di chuyển xuống từ breakpoint trở đi).
Trả lời truy vấn: Với truy vấn , tìm kiếm nhị phân trên stack của cột để xác định đoạn chứa hàng , rồi tính giá trị trực tiếp.
Khởi tạo cột 1: , tức eval(pre_col=0, k=-c_0, x, col=0) = x \cdot c_0 - c_0.
Độ phức tạp
- Thời gian: — mỗi đoạn được thêm/xóa khỏi stack tối đa 1 lần, tìm kiếm nhị phân ; mỗi truy vấn .
- Bộ nhớ:
Bình luận