f1[0][i] f1[1][i] 两个数列 到i为止的最大区间和(i:1-->N)即left-->right
static final int[][] f1 = new int[2][MaxN + 5];
f2[0][i] f2[1][i] 两个数列 到i为止的最大区间和(i:N-->1)即right-->left
static final int[][] f2 = new int[2][MaxN + 5];
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import static java.lang.Math.max;
public class Solution{
static int N, ans;
static final int MaxN = 300000;
static StreamTokenizer in;
static final int[][] d = new int[2][MaxN + 5];
static final int[][] f = new int[2][MaxN + 5];
static final int[][] f1 = new int[2][MaxN + 5];
static final int[][] f2 = new int[2][MaxN + 5];
public static void main(String[] args) throws IOException {
in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
int T = nextInt();
for (int tc = 1; tc <= T; tc++) {
readCase();
ans = 0;
work();
System.out.println("#" + tc + " " + ans);
}
}
private static void work() {
Arrays.fill(f[0], 0);
Arrays.fill(f[1], 0);
for (int i = 1; i <= N; i++) {
f[0][i] = max(f[0][i - 1] + d[0][i], d[0][i]);
f1[0][i] = max(f[0][i], f1[0][i - 1]);
f[1][i] = max(f[1][i - 1] + d[1][i], d[1][i]);
f1[1][i] = max(f[1][i], f1[1][i - 1]);
}
Arrays.fill(f[0], 0);
Arrays.fill(f[1], 0);
for (int i = N; i > 0; i--) {
f[0][i] = max(f[0][i + 1] + d[0][i], d[0][i]);
f2[0][i] = max(f[0][i], f2[0][i + 1]);
f[1][i] = max(f[1][i + 1] + d[1][i], d[1][i]);
f2[1][i] = max(f[1][i], f2[1][i + 1]);
}
for (int i = 1; i <= N; i++) {
ans = max(f1[0][i] + f2[1][i + 1], f1[1][i] + f2[0][i + 1]);
}
}
private static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
private static void readCase() throws IOException {
N = nextInt();
for (int i = 1; i <= N; i++) d[0][i] = nextInt();
for (int i = 1; i <= N; i++) d[1][i] = nextInt();
Arrays.fill(f1[0], 0);
Arrays.fill(f1[1], 0);
Arrays.fill(f2[0], 0);
Arrays.fill(f2[1], 0);
}
}