두 배열로 생성한 N by N 행렬의 모든 K by K 부분행렬에서 최댓값의 합을 구합니다.
보통5슬라이딩 윈도우행렬큐면접 대비아직 제출이 없습니다시간 제한20초메모리 제한1024 MB음이 아닌 정수로 이루어진 N×N 행렬 M이 있다. M 안에 들어 있는 모든 K×K 부분행렬마다 그 안의 최댓값을 하나씩 골라 목록을 만든 다음, 목록에 있는 값을 전부 더한 값을 구하려고 한다. 부분행렬끼리는 서로 겹칠 수 있으므로 목록의 길이는 (N−K+1)2이다. 같은 칸이 여러 부분행렬에서 동시에 최댓값이 되면 그 값은 목록에 여러 번 들어간다.
행렬을 그대로 입력하면 크기가 너무 커지므로, 길이가 N인 배열 A와 B, 그리고 정수 C와 X가 대신 주어진다. i번째 행 j번째 열의 값 Mij는 다음과 같이 정한다.
Mij=(Ai×i+Bj×j+C)modX
i와 j는 모두 1 이상 N 이하이다.
첫 줄에 테스트 케이스의 개수 T가 주어진다. 이어서 T개의 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 줄에는 네 정수 N, K, C, X가 공백으로 구분되어 주어진다. 다음 두 줄에는 각각 정수가 N개씩 주어지는데, 첫 줄이 배열 A이고 둘째 줄이 배열 B이다.
각 테스트 케이스마다 한 줄에 Case #x: y 형식으로 출력한다. x는 1부터 시작하는 테스트 케이스 번호이고, y는 모든 K×K 부분행렬의 최댓값을 더한 값이다.
예제의 첫 번째 테스트 케이스에서 행렬은 다음과 같다.
3
K=1이라 부분행렬이 하나뿐이므로 답은 3이다.
두 번째 테스트 케이스의 행렬은 다음과 같다.
9 3
1 6
K=1이므로 네 칸이 각각 부분행렬이 되고, 답은 9+3+1+6=19이다.
세 번째 테스트 케이스의 행렬은 다음과 같다.
11 11 24
13 13 26
14 14 27
K=2인 부분행렬은 네 개이고 최댓값은 각각 13, 26, 14, 27이므로 답은 80이다.