2가지 방법으로 풀어보려고 한다.
1. top-down 방식 [Main.java]
이렇게 불러야 할지 모르겠지만 top-down 방식으로 풀어보도록 하겠다.
먼저 어떠한 값 (row, col)에 마지막에 도달하기 위해서는 아래 그림과 같은 접근만 가능하다.
그림에서 같이 값(row, col)에 대하여 접근할 수 있는 방법은 row = 0 일 때는 (row + 1, col - 2)와 (row + 1, col -1)에서 접근이 가능하다.
다음으로 row = 1일때는 (row - 1, col -2), (row - 1, col - 1)에서 접근이 가능하다.
문제에서는 최대값을 구하는 것이기에 접근할 수 있는 두 값 중 큰 것에서 마지막 값 (row, col)에 접근하면 되는 것이다. Math.max((row + 1, col - 2), (row + 1, col - 1)) [규칙 부분]
top-down 방식은 재귀를 통해 마지막까지 접근해 다시 역으로 올라오는 것이다. 다시말해 재귀의 종료시점은 배열이라면 첫 번째 값 [0]에 해당할 것이다. [초기화 부분]
다음으로 중요한 것은 예외이다. 위에서 보인 규칙에 따르면 현재 값의 (col -1)과 (col - 2) 값을 비교한다. 해당 문제를 풀기위해 배열을 사용할텐데, col <=1 이라면 배열에 벗어나 버려 오류가 발생한다 [예외 부분]
위의 조건들을 합치면 문제를 해결할 수 있다.
static int[][] stickers;
static Integer[][] dp;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for(int i = 0; i < T; i++) {
int N = Integer.parseInt(br.readLine());
stickers = new int[2][N + 1];
for(int j = 0; j < 2; j++) {
st = new StringTokenizer(br.readLine(), " ");
for(int k = 1; k <= N; k++) {
stickers[j][k] = Integer.parseInt(st.nextToken());
}
}
dp = new Integer[2][N + 1];
dp[0][1] = stickers[0][1];
dp[1][1] = stickers[1][1];
System.out.println(Math.max(recur(0, N), recur(1, N)));
}
private static int recur(int row, int col) {
if (col == 1) {
return stickers[row][col];
}
if (dp[row][col] == null) {
if (col == 2) {
dp[row][col] = recur(1 - row, col - 1) + stickers[row][col];
} else {
dp[row][col] = Math.max(recur(1 - row, col - 1), recur(1 - row, col - 2)) + stickers[row][col];
}
}
return dp[row][col];
}
static int dp[][], stickers[][];
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for(int i = 0; i < T; i++) {
int N = Integer.parseInt(br.readLine());
stickers = new int[2][N + 1];
dp = new int[2][N + 1];
for(int j = 0; j < 2; j++) {
st = new StringTokenizer(br.readLine(), " ");
for(int k = 1; k <= N; k++) {
stickers[j][k] = Integer.parseInt(st.nextToken());
}
}
dp[0][1] = stickers[0][1];
dp[1][1] = stickers[1][1];
for(int j = 2; j <= N; j++) {
dp[0][j] = Math.max(dp[1][j - 1], dp[1][j - 2]) + stickers[0][j];
dp[1][j] = Math.max(dp[0][j - 1], dp[0][j - 2]) + stickers[1][j];
}
System.out.println(Math.max(dp[0][N], dp[1][N]));
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] stickers;
static Integer[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for(int i = 0; i < T; i++) {
int N = Integer.parseInt(br.readLine());
stickers = new int[2][N + 1];
for(int j = 0; j < 2; j++) {
st = new StringTokenizer(br.readLine(), " ");
for(int k = 1; k <= N; k++) {
stickers[j][k] = Integer.parseInt(st.nextToken());
}
}
dp = new Integer[2][N + 1];
dp[0][1] = stickers[0][1];
dp[1][1] = stickers[1][1];
System.out.println(Math.max(recur(0, N), recur(1, N)));
}
}
private static int recur(int row, int col) {
if (col == 1) {
return stickers[row][col];
}
if (dp[row][col] == null) {
if (col == 2) {
dp[row][col] = recur(1 - row, col - 1) + stickers[row][col];
} else {
dp[row][col] = Math.max(recur(1 - row, col - 1), recur(1 - row, col - 2)) + stickers[row][col];
}
}
return dp[row][col];
}
}