https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
문제 접근
https://chaechaepower.tistory.com/15
> 과거의 내가 아주 잘 정리해둠.
▲ 간과한 것
- N을 키우면서 규칙을 찾을 것
- dp 배열 정의를 명확하게 세울 것
코드
top down - 재귀
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static Integer[][] dp;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int testN = Integer.parseInt(bf.readLine());
for (int i = 0; i < testN; i++) {
int n = Integer.parseInt(bf.readLine());
arr = new int[2][n];
dp = new Integer[2][n];
StringTokenizer st;
for (int j = 0; j < 2; j++) { // arr[][] 초기화
st = new StringTokenizer(bf.readLine());
for (int k = 0; k < n; k++) {
arr[j][k] = Integer.parseInt(st.nextToken());
}
}
dp[0][0] = arr[0][0];
dp[1][0] = arr[1][0];
if (n >= 2) {
dp[0][1] = arr[0][1] + arr[1][0];
dp[1][1] = arr[1][1] + arr[0][0];
}
System.out.println(Math.max(recur(0, n - 1), recur(1, n - 1)));
}
bf.close();
}
static int recur(int i, int j) {
if (dp[i][j] == null) {
if (i == 0) {
dp[i][j] = Math.max(recur(1, j - 1), recur(1, j - 2)) + arr[0][j];
}
if (i == 1) {
dp[i][j] = Math.max(recur(0, j - 1), recur(0, j - 2)) + arr[1][j];
}
}
return dp[i][j];
}
}
bottom up - 반복문
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static Integer[][] dp;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int testN = Integer.parseInt(bf.readLine());
for (int i = 0; i < testN; i++) {
int n = Integer.parseInt(bf.readLine());
arr = new int[2][n];
dp = new Integer[2][n];
StringTokenizer st;
for (int j = 0; j < 2; j++) { // arr[][] 초기화
st = new StringTokenizer(bf.readLine());
for (int k = 0; k < n; k++) {
arr[j][k] = Integer.parseInt(st.nextToken());
}
}
dp[0][0] = arr[0][0];
dp[1][0] = arr[1][0];
if (n >= 2) {
dp[0][1] = arr[0][1] + arr[1][0];
dp[1][1] = arr[1][1] + arr[0][0];
}
for (int j = 2; j < n; 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 - 1], dp[1][n - 1]));
}
bf.close();
}
}
'백준' 카테고리의 다른 글
DP: #2579: 계단오르기 [JAVA] (0) | 2023.06.06 |
---|---|
DP #2156: 포도주 시식 [JAVA] (0) | 2023.06.06 |
DP #2193: 이친수 [JAVA] (0) | 2023.06.01 |
DP: #11057: 오르막 수 [JAVA] (0) | 2023.05.29 |
DP #10844: 쉬운 계단 수 [JAVA] (0) | 2023.05.29 |