package org.example;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static ArrayList<Integer> sticker;
static boolean[] visited;
static int n, sum, max;
public static void main(String[] args) throws IOException {
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
n = Integer.parseInt(br.readLine());
// 2번째 행은 n ~ 2n-1 sticker = new ArrayList<>();
for (int j = 0; j < 2; j++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int k = 0; k < n; k++) {
sticker.add(Integer.parseInt(st.nextToken()));
}
}
// 조합
visited = new boolean[sticker.size()];
max = 0;
combination(0, sticker.size(), n);
System.out.println(max);
}
}
private static void combination(int start, int arrSize, int r) {
if(r == 0) {
return;
}
for(int i = start; i < arrSize; i++) {
if (!visited[i]) {
visited[i] = true;
sum += sticker.get(i);
// 가장 왼쪽 열이 아닐 경우
if (i != 0 && i != n) {
visited[i - 1] = true;
}
// 가장 오른쪽 열이 아닐 경우
if (i != n - 1 && i != (2 * n) - 1) {
visited[i + 1] = true;
}
// 1행이면 아래칸 방문표시
if (i < n) {
visited[i + n] = true;
}
combination(i + 1, arrSize, r - 1);
} else { // 방문 안했을 경우 r 그대로
combination(i + 1, arrSize, r);
}
visited[i] = false;
max = Math.max(max, sum);
sum = 0;
}
}
/*
* 5 * 50 10 100 20 40 * 30 50 70 10 60 * 50 100 50 60 -> 260 * 무조건 가장 많은 스티커를 붙히는 것이 최고 점수는 아님
private static void findMax() { int max = 0;
for (int i = 0; i < 2; i++) { visited = new boolean[sticker.size()]; int sum = 0;
for (int j = i; j < 2 * n; j++) { if (visited[j]) { continue; } visited[j] = true; sum += sticker.get(j);
// 가장 왼쪽 열이 아닐 경우
if (j != 0 && j != n) { visited[j - 1] = true; }
// 가장 오른쪽 열이 아닐 경우
if (j != n - 1 && j != (2 * n) - 1) { visited[j + 1] = true; }
// 1행이면 아래칸 방문표시
if (j < n) { visited[j + n] = true; } }
max = Math.max(sum, max);
System.out.println("sum : " + sum); } System.out.println(max); } */}