아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

원통 게임의 즐거움

시간 제한1초메모리 제한128 MB

요약
원통 격자에서 이동 제한을 지키며 각 행에서 한 칸씩 골라 합이 최대가 되는 선택을 구하고 동점인 경우 사전 순으로 가장 앞선 것을 출력합니다.
난이도

보통10점 중 6점

유형
동적 계획법, 슬라이딩 윈도우
정답자
아직 제출이 없습니다

문제

원통 게임은 아직 어디에도 공개되지 않은 새 게임이다. 이 게임을 만든 사람은 공개하기 전에 최적의 진행을 찾아 주는 프로그램을 먼저 갖추고 싶어 한다.

게임판은 원통이다. 원통은 위에서부터 11번부터 NN번까지 번호가 붙은 NN개의 행으로 나뉘고, 각 행은 다시 11번부터 MM번까지 번호가 붙은 MM개의 칸으로 나뉜다. 칸마다 수가 하나 적혀 있다. 게임판이 원통이므로 같은 행의 11번 칸과 MM번 칸은 서로 붙어 있다.

칸은 두 수 XX와 YY로 나타낸다. XX는 행 번호이고 YY는 그 행에서의 칸 번호다. 두 칸 (X1,Y1)(X_1, Y_1)과 (X2,Y2)(X_2, Y_2) 사이의 거리는 다음과 같다.

∣X1−X2∣+min⁡(∣Y1−Y2∣,M−∣Y1−Y2∣)|X_1 - X_2| + \min(|Y_1 - Y_2|, M - |Y_1 - Y_2|)

게임은 첫 번째 행에서 아무 칸이나 하나 골라 시작한다. 그다음부터는 현재 칸에서 다음 행의 칸으로 옮겨 가는데, 두 칸 사이의 거리가 KK를 넘지 않아야 한다. 마지막 행에 닿을 때까지 이 이동을 반복한다. 점수는 고른 칸에 적힌 수를 모두 더한 값이고, 이 점수를 최대로 만들어야 한다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 첫째 줄에 테스트 케이스의 개수 TT가 주어진다(1≤T≤1001 \le T \le 100). 그 뒤로 TT개의 테스트 케이스가 이어진다.

각 테스트 케이스는 N+1N + 1개의 줄로 주어진다. 첫째 줄에는 행의 개수 NN, 한 행의 칸 개수 MM, 한 번의 이동에서 허용되는 최대 거리 KK가 정수로 주어진다(1≤N,M,K≤10001 \le N, M, K \le 1000).

이어지는 NN개의 줄에는 각각 MM개의 수가 주어진다. ii번째 줄의 jj번째 수는 칸 (i,j)(i, j)에 적힌 수다. 주어지는 모든 수의 절댓값은 10001000 이하다.

출력

각 테스트 케이스마다 한 줄을 출력한다. 먼저 얻을 수 있는 최대 점수를 출력하고, 공백 하나를 둔 다음 NN개의 수를 공백 하나씩으로 구분해 출력한다. ii번째 수는 ii번째 행에서 고른 칸의 번호다.

최대 점수를 얻는 방법이 여러 가지면 사전순으로 가장 앞서는 것을 출력한다. 두 답 XX와 YY가 처음으로 달라지는 자리에서 XX의 수가 더 작으면 XX가 YY보다 사전순으로 앞선다.

참고

연속한 두 행의 행 번호 차이는 항상 11이므로, ii번째 행의 yy번 칸에서 i+1i + 1번째 행의 y′y'번 칸으로 가는 이동은 min⁡(∣y−y′∣,M−∣y−y′∣)≤K−1\min(|y - y'|, M - |y - y'|) \le K - 1일 때만 허용된다. 따라서 K=1K = 1이면 칸 번호를 끝까지 바꿀 수 없다.

모든 행에서 정확히 한 칸씩 고르므로 출력하는 칸 번호는 항상 NN개다.

예제1

  1. 예제 1

    입력
    1
    11 12 3
    5 -2 -5 0 3 10 0 0 0 0 0 0
    1 0 -5 7 9 5 0 0 0 0 0 0
    2 5 3 3 1 0 0 0 0 0 0 0
    9 7 5 1 2 3 0 0 0 0 0 0
    8 8 7 -4 5 5 0 0 0 0 0 0
    11 2 4 -1 5 9 0 0 0 0 0 0
    10 20 15 21 3 -5 0 0 0 0 0 0
    1 2 0 2 1 0 0 0 0 0 0 0
    3 2 1 3 -2 0 0 0 0 0 0 0
    5 6 12 10 11 -9 0 0 0 0 0 0
    0 -1 -2 5 7 3 0 0 0 0 0 0
    
    예상 출력
    94 6 4 2 1 1 1 2 2 1 3 5