https://www.acmicpc.net/problem/9465
โ๏ธ ๋ฌธ์
๐ ๋ฌธ์ ํด๊ฒฐ
ํด๋น ๋ฌธ์ ๋ 2xN ์คํฐ์ปค๊ฐ ์ฃผ์ด์ก์ ๋, ์คํฐ์ปค๋ฅผ ๊ณจ๋ผ ๊ฐ์ฅ ๋์ ์ ์์ ํฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค. ์ด๋ ๊ณ ๋ฅธ ์คํฐ์ปค์ ์ข,์ฐ,์,ํ ์คํฐ์ปค๋ ์ ํํ ์ ์๊ฒ ๋ฉ๋๋ค.
์๋ ์ด ๋ฌธ์ ๋ ๊ฐ๋ก๋ก arr[0][0] -> arr[0][1] ... -> arr[1][N]
์ด๋ฐ ์์ผ๋ก ์งํํ๋ฉด์ ๊ณ์ฐํ๋ ค ํ๋๋ ์คํจํ์ฌ์
์ธ๋ก (arr[0][1] -> arr[1][1] -> arr[2][0] ... -> arr[1][N])
๋ก ์ ๊ทผํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค.
๋จผ์ ์คํฐ์ปค๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
๊ฐ ํ๊ณผ ์ด์ ์์ ์ธ๋ฑ์ค๋ฅผ 0๊ณผ 1์ด๋ผ๊ณ ํ๋ค๋ฉด, ๊ฐ์ฅ ํฐ ์ ์์ ์กฐํฉ์ arr[0][1], arr[1][2], arr[0][3], arr[1][5]
์ด๋ ๊ฒ 4๊ฐ๋ฅผ ์ ํํ ๊ฒฝ์ฐ์
๋๋ค. dp ๋ฐฐ์ด์ ํ๋ ์์ฑํ์ฌ ์ฌ์ฉํ๋์ง ์ํ๋์ง๋ฅผ ์ฒดํฌํด์ฃผ๋ฉด์ ์งํํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
1. ํ ์ด๋ธ ์ ์
dp[i][n][m]
๋ iํ n์ด์ ์คํฐ์ปค๋ฅผ ์ ํํ๋์ง์ ์ฌ๋ถ(m)์ ๋ฐ๋ฅธ ์ ์์ ์ต๋์ ํฉ์ด๋ผ๊ณ ์ ์ํ์์ต๋๋ค.
- i๋ 0, 1์ ๊ฐ์ ๊ฐ์ง๋๋ค.
- n์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ต๋๋ค.
- m์ 0, 1์ ๊ฐ์ ๊ฐ์ง๋๋ค.
2. ์ ํ์ ์ธ์ฐ๊ธฐ
๋จผ์ ๊ทธ๋ฆผ์ ๋ณด๊ณ ๊ฐ์ ๊ตฌํ๋ฉด์ ์ ํ์์ ์ธ์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
i๊ฐ 2์ผ ๋์, ์ ๋ณ์ ๋จผ์ ๊ณ์ฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
arr[0][2][0] = [0][2]
์ ์คํฐ์ปค๋ฅผ ์ ํํ์ง ์์ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ ๊ฐ๋ค ์ค ์ต๋ ๊ฐ์ ์ ํํ๋ฉด ๋ฉ๋๋ค.[1][1]
์คํฐ์ปค๋ฅผ ์ ํํ์ง ์์ ๊ฒฝ์ฐ[1][1]
์คํฐ์ปค๋ฅผ ์ ํํ ๊ฒฝ์ฐ- (
dp[1][1]
๋ฐฐ์ด์ ์ด์ ๊น์ง ์ ์๋ค์ ๊ณ์ฐํ์๊ธฐ ๋๋ฌธ์ ์ต๋ ๊ฐ์ ๋ฃ์ด์ค๋๋ค.)
arr[0][2][1] = [0][2]
์ ์คํฐ์ปค๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์๋์ ๊ฐ๋ค ์ค ์ต๋ ๊ฐ์ ์ ํํ์ฌ+ arr[0][2]
๊ฐ์ด ๋ฉ๋๋ค.[0][1]
์คํฐ์ปค๋ฅผ ์ ํํ์ง ์์ ๊ฒฝ์ฐ[1][1]
์คํฐ์ปค๋ฅผ ์ ํํ ๊ฒฝ์ฐ
๊ทธ ๋ค์ ๋ฐ ๋ณ์ ๊ณ์ฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
arr[1][2][0] = [1][2]
์คํฐ์ปค๋ฅผ ์ ํํ์ง ์์ ๊ฒฝ์ฐ์ ๋๋ค. ์๋์ ๊ฐ๋ค ์ค ์ต๋ ๊ฐ์ ์ ํํ๋ฉด ๋ฉ๋๋ค.[1][1]
์คํฐ์ปค๋ฅผ ์ ํํ ๊ฒฝ์ฐ์ ์ ํํ์ง ์์ ๊ฒฝ์ฐ (์ฆ,[0][2]
๋ฅผ ์ ํํ์ง ์์ ๊ฒฝ์ฐ์ ๊ฐ๊ณผ ๊ฐ๋ค.)[0][2]
์คํฐ์ปค๋ฅผ ์ ํํ ๊ฒฝ์ฐ์ ์ ํํ์ง ์์ ๊ฒฝ์ฐ
arr[1][2][1] = [1][2]
์คํฐ์ปค๋ฅผ ์ ํํ ๊ฒฝ์ฐ์ ๋๋ค.[1][1]
์คํฐ์ปค๋ฅผ ์ ํํ์ง ์์ ๊ฒฝ์ฐ์arr[1][2]
๊ฐ์ ํฉ์ด ๋ฉ๋๋ค.
์ ํ์์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
dp[0][i][0] = Math.max(dp[1][i-1][0], dp[1][i-1][1]);
dp[0][i][1] = Math.max(dp[0][i-1][0], dp[1][i-1][1]) + arr[0][i];
dp[1][i][0] = Math.max(dp[0][i][0], dp[0][i][1]);
dp[1][i][1] = dp[1][i-1][0] + arr[1][i];
3. ์ด๊ธฐ๊ฐ ์ค์
dp[0][1][0] = 0;
dp[0][1][1] = arr[0][1];
dp[1][1][0] = dp[0][1][1];
dp[1][1][1] = arr[1][1];
dp[0][1][0]
=[0][1]
์คํฐ์ปค๋ฅผ ์ ํํ์ง ์์์ ๊ฒฝ์ฐ์๋ ๋น์ฐํ ํฉ์ด 0์ผ ๊ฒ์ ๋๋ค.dp[0][1][1]
=[0][1]
์คํฐ์ปค๋ฅผ ์ ํํ ๊ฒฝ์ฐ์๋ ํด๋น ์คํฐ์ปค์ ๊ฐ์ ๊ฐ์ง๋๋ค.dp[1][1][0]
=[1][1]
์คํฐ์ปค๋ฅผ ์ ํํ์ง ์์์ ๊ฒฝ์ฐ์๋ ์ด์ ์คํฐ์ปค๋ฅผ ์ ํํ ๊ฐ๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.dp[1][1][1]
=[1][1]
์คํฐ์ปค๋ฅผ ์ ํํ ๊ฒฝ์ฐ์๋[0][1]
์คํฐ์ปค๋ฅผ ์ ํํ ์ ์์ต๋๋ค.arr[0][1]
๊ฐ๋ง ๊ฐ์ต๋๋ค.
๐ ์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(bf.readLine());
int N = 0;
int[][] arr;
int[][][] dp;
for(int t=0; t<T; t++){
N = Integer.parseInt(bf.readLine());
arr = new int[2][N+1];
dp = new int[2][N+1][2];
for(int p=0; p<2; p++) {
st = new StringTokenizer(bf.readLine());
for(int i=1; i<=N; i++) {
arr[p][i] = Integer.parseInt(st.nextToken());
}
}
// ์ ๋ณ ์ด๊ธฐ๊ฐ ์ค์
dp[0][1][0] = 0;
dp[0][1][1] = arr[0][1];
// ๋ฐ ๋ณ ์ด๊ธฐ๊ฐ ์ค์
dp[1][1][0] = dp[0][1][1];
dp[1][1][1] = dp[0][1][0] + arr[1][1];
// dp ์์
for(int n=2; n<=N; n++) {
// ์ ๋ณ ๊ณ์ฐ
dp[0][n][0] = Math.max(dp[1][n-1][0], dp[1][n-1][1]);
dp[0][n][1] = Math.max(dp[0][n-1][0], dp[1][n-1][1]) + arr[0][n];
// ๋ฐ ๋ณ ๊ณ์ฐ
dp[1][n][0] = Math.max(dp[0][n][0], dp[0][n][1]);
dp[1][n][1] = dp[1][n-1][0] + arr[1][n];
}
System.out.println(Math.max(dp[1][N][0], dp[1][N][1]));
}
}
}