최코딩의 개발
[백준 9465번] 스티커 본문
728x90
https://www.acmicpc.net/problem/9465
package dp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class DP9465 {
static int N;
static int[][] arr;
static int[][] 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++) {
N = Integer.parseInt(br.readLine());
arr = 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 + 1; k++) {
arr[j][k] = Integer.parseInt(st.nextToken());
}
}
solution();
}
}
private static void solution() {
dp[0][1] = arr[0][0];
dp[1][1] = arr[1][0];
for (int j = 2; j < N + 1; j++) {
dp[0][j] = Math.max(dp[1][j - 1], dp[1][j - 2]) + arr[0][j];
dp[1][j] = Math.max(dp[0][j - 1], dp[0][j - 2]) + arr[1][j];
}
System.out.println(Math.max(dp[0][N], dp[1][N]));
}
}
전형적인 DP의 문제이다.
초반에는 경우의 수가 너무 많아서 어떻게 풀어야 될지 감이 안왔다. 하지만 DP 문제니깐 단위를 나누어서 쪼개봐서 생각을 해봤다.
01 | 02 | 03 |
11 | 12 | 13 |
이렇게 있다고 가정하면 02는 11과 합쳐서 dp[0][2]=dp[1][1] + arr[0][2] 를 넣는다. 12는 01과 합쳐서 dp[1][2]=dp[0][1] + arr[1][2] 를 넣는다.
그럼 03은 dp[1][1] 과 dp[1][2] 중 큰 값을 비교해서 넣어줌과 동시에 arr[1][3]을 더해주면 된다. 13도 마찬가지!!
이렇게 쭉 계산해서 마지막 최종에서 큰 값을 비교하면된다.
728x90
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 17266번] 어두운 굴다리 (0) | 2025.01.24 |
---|---|
[백준 20922번] 겹치는 건 싫어 (2) | 2025.01.23 |
[백준 16928번] 뱀과 사다리 게임 (0) | 2024.12.23 |
[백준 1967] 숨바꼭질 (0) | 2024.12.22 |
[백준 2304번] 창고 다각형 (0) | 2024.12.22 |