Problem
https://vn.spoj.com/problems/BONUS
https://oj.vnoi.info/problem/BONUS
Tuấn là người chiến thắng trong một cuộc thi “tìm hiểu kiến thức vũ trụ” và được nhận các phần thưởng do công ty XYZ tài trợ. Các phần thưởng được bố trí trên một bảng hình vuông N x N
có dạng một lưới ô vuông kích thước đơn vị. Các dòng của bảng được đánh số từ 1
đến n
, từ trên xuống dưới và các cột của bảng được đánh số từ 1
đến n
, từ trái qua phải. Ô nằm trên giao của dòng i
và cột j
được gọi là ô (i,j)
và trên ô đó chứa một món quà có giá trị là a[i,j]
(1 <= i
, j <= n
)
Đề nhận phần thưởng, Tuấn được phép chọn một hình vuông kích thước k x k
chiếm trọn trong một số ô của bảng và nhận tất cả các phần quà có trong các ô nằm trong hình vuông đó.
Yêu cầu
Hãy xác định tổng giá trị lớn nhất của món quà mà Tuấn có thể nhận được.
Dữ liệu
- Dòng thứ nhất chứa hai sô nguyên dương
n
, k
(n <= 1000
, n/3 <= k <= n
). - Dòng thứ
i
trong số n
dòng tiếp theo chứa n
số nguyên dương, số thứ j
là a[i,j]
(a[i,j] <= 1000
)
Kết quả
Ghi ra một số nguyên duy nhất là tổng giá trị lớn nhất của các món quà mà Tuấn có thể nhận được.
Ràng buộc
50% số test ứng với 50% số điểm của bài có n <= 100.
Ví dụ
Input
4 3
1 9 1 1
9 9 9 9
1 9 9 9
1 9 9 14
Output
86
Tutorial
Gọi F[i][j]
là tổng từ ô (1,1)
đến ô (i,j)
, có thể tính bằng công thức QHĐ đơn giản:
F[i][j] = a[i][j] + F[i-1][j] + F[i][j-1] - F[i-1][j-1]
Sau đó, với mỗi vị trí (i,j)
, tính tổng của hình vuông từ (i-k+1, j-k+1)
đến ô (i,j)
bằng các giá trị F
đã tính trước đó:
S(i,j) = F[i][j] - F[i-k][j] - F[i][j-k] + F[i-k][j-k]
Giá trị cần tìm là max(S_ij)
trong các option (i,j)
có thể chọn.
Độ phức tạp: O(N^2)
.
Submission
Nếu bạn thấy bài viết này hay, hãy share bài viết này cho mọi người nhé 😉.
Share this post →