11이 되면 모든 포지션에서 탐색한 것이므로 list에 합산된 sum을 넣어주고 종료한다
한가지 주의할점이 11만큼 순회하면서 미방문 했을 때 백트래킹을 해주는데
이때 arr[i][depth]가 0이 아닐 때, 재귀식을 실행시키도록 해야한다
이렇게 조건을 추가로 걸어주지 않으면 11^11의 연산이 발생하므로 시간제한을 초과할 것이다
(1회차 시도 성공)
import java.io.*;
import java.util.*;
public class Main {
static int[][] arr = new int[11][11];
static boolean[] visited;
static List<Integer> list;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
for (int j = 0; j < 11; j++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int k = 0; k < 11; k++) {
arr[j][k] = Integer.parseInt(st.nextToken());
}
}
list = new ArrayList<>();
visited = new boolean[11];
backtracking(0, 0);
list.sort(Collections.reverseOrder());
bw.write(list.get(0)+"\n");
}
br.close();
bw.close();
}
private static void backtracking(int depth, int sum) {
if(depth == 11){
list.add(sum);
return;
}
for (int i = 0; i < 11; i++) {
if(!visited[i] && arr[i][depth] != 0){
visited[i] = true;
backtracking(depth+1, sum + arr[i][depth]);
visited[i] = false;
}
}
}
}