μ μν Sticker λ°°μ΄ Sκ° μμ κ°μ΄ μλ€κ³ μκ°ν΄λ³΄μ.
κ·Έλ¦¬κ³ Sticker λ°°μ΄κ³Ό ν¬κΈ°κ° κ°μ Dp λ°°μ΄μ΄ μλ€κ³ μκ°ν΄λ³΄μ.
Dp λ°°μ΄μ ν΄λΉ μμΉλ₯Ό λ―μμ λ, μ»μ μ μλ μ΅λμ μ μλ₯Ό κΈ°λ‘ν΄ λκ° κ²μ΄λ€.
λ¨Όμ Dp[0][1] κ³Ό Dp[1][1]μ κ°λ¨νλ€. ν΄λΉνλ λΆλΆμ λ―μμ λ, ν΄λΉνλ μ μλ§ νλν μ μμ κ²μ΄λ€.
κ·Έλ λ€λ©΄, λλ²μ§Έ μ΄λΆν°λ μ μκ° μ΄λ»κ² λ κΉ?
λ Έλ λ°νμ΄ μ€ν°μ»€λ₯Ό λ―μ λΆλΆμ΄λΌκ³ μκ°ν λ,
S[0][2] λ₯Ό λ―μμ λ μ»μ μ μλ μ΅κ³ μ μλ,
μμμ μΌλ‘ νλλ§ λ―λκ²μ΄ μλ, μΈμ νμ§ μμ S[1][1]κΉμ§ λ―μ μ μμ ν©μΌ κ²μ΄λ€.
μ¦ Dpλ
ν΄λΉ μμΉλ₯Ό λ―μμ λ μ»μ μ μλ μ΅λ μ μλ₯Ό κΈ°λ‘νλ κ²μ΄κΈ° λλ¬Έμ, μμ κ°μ΄ κΈ°λ‘ν μ μλ€.
3λ²μ§Έ μ΄μ μ΄λ»κ² λ κΉ?
S[0][3]μ κ²½μ° 2κ°μ§ λ°©λ²μΌλ‘ μ€ν°μ»€λ₯Ό λ―μ μ μλ€.
Case. 1μ κ²½μ° S[0][1] + S[1][2] + S[0][3] μ μ μλ₯Ό νλν μ μκ³
Case. 2μ κ²½μ° S[1][1] + S[0][3] μ μ μλ₯Ό νλν μ μλ€.
λ μ€ μ΄λ€ λ°©λ²μ μ νν΄μΌνλμ§λ λΉμ°ν S[0][1] +S[1][2] κ³Ό S[1][1] μ€ ν° μ μλ₯Ό κ°μ§ Caseλ₯Ό μ νν΄μΌ νλ€.
μμ μμμ κ²½μ°λ S[0][1] +S[1][2] = 100 μ΄κ³ S[1][1] = 30 μ΄κΈ° λλ¬Έμ, Case.1 μ΄ λ λμ μ μλ₯Ό νλν μ μμ§λ§,
Case. 2 κ° λ μ 리ν κ²½μ°λ μλ€.
μμ μμμ κ²½μ°λ, S[0][1] +S[1][2] = 70 μ΄κ³ S[1][1] = 80 μ΄κΈ° λλ¬Έμ, Case.2 κ° λμ μ μλ₯Ό νλν μ μλ€.
μ¦, μΌλ°νλ₯Ό μμΌλ³΄λ©΄,
Dp[0][3] = max(S[0][1] + S[1][2] , S[1][1] ) + S[0][3] = max(Dp[1][1] , Dp[0][2]) + S[0][3] μμ μ μ μλ€.
λ§μ°¬κ°μ§λ‘ Dp[1][3] = max(S[1][1] + S[0][2] , S[0][1] ) + S[1][3] = max(Dp[0][1] , Dp[0][2]) +S[1][3] κ° λλ€.
μ΄ κ·μΉμ μ΄μ©ν΄μ Dp ν μ΄λΈμ μ±μλκ°λ©΄ λλ€!
μ΄ μ νμμ nμ 2λ‘ μ λ ₯λ°μλ μλλ μ μκ²,
μμ κ°μ΄ 첫λ²μ§Έ μ΄μ μ μκ° 0μ΄ λ€μ΄κ°κ², Sticker λ°°μ΄κ³Ό Dp λ°°μ΄μ μμ±νμλ€.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.valueOf(br.readLine());
for(int i=1;i<=T;i++) {
int n = Integer.valueOf(br.readLine());
long [][] Sticker = new long[2][n+1];
long [][] Dp = new long[2][n+1];
//Sticker μ Dp λ°°μ΄ μμ±
for (int j = 0; j < 2; j++) {
String[] input = br.readLine().split(" "); // 곡백 λ¨μλ‘ λμ΄ λ°°μ΄μ΄ μμ±λ¨
for (int k = 1; k < n+1; k++) {
Sticker[j][k]= Long.valueOf(input[k-1]); //Sticker λ°°μ΄μ λ°μ΄ν° μ±μ°κΈ°
}
}
Dp[0][1] = Sticker[0][1];
Dp[1][1] = Sticker[1][1];
//μ΄κΈ°κ° μ±μμ£ΌκΈ°
for(int j=2;j<=n;j++) {
Dp[0][j]= Math.max(Dp[1][j-2],Dp[1][j-1])+Sticker[0][j];
Dp[1][j]= Math.max(Dp[0][j-2],Dp[0][j-1])+Sticker[1][j];
}
//μ€ν°μ»€ ν
μ΄λΈμ μ΄μ΄ 2 μ΄μμΈ κ²½μ°μ λμ
long result = Math.max(Dp[0][n], Dp[1][n]);
System.out.println(result);
}
}
}