https://www.acmicpc.net/problem/9465
사용 알고리즘
- 다이나믹 프로그래밍
풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
테이블:
* d[0][i]: i번째 열에 도달했을 때 아무 스티커도 선택하지 않을때 최고점수
* d[1][i]: i번째 열에 도달했을 때 위쪽 스티커를 선택할 때 최고점수
* d[2][i]: i번째 열에 도착했을 때 아래쪽 스티커를 선택할 때 최고점수
점화식
* d[0][i]= Math.max(d[0][i-1], d[1][i-1], d[2][i-1])
* d[1][i] = Math.max(d[0][i-1], d[2][i-1]) + sticker[0][i]
* d[2][i] = Math.max(d[0][i-1], d[1][i-1]) + sticker[1][i]
*/
public class Main {
static int t;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t = Integer.parseInt(br.readLine());
for(int test = 0; test < t; test++) {
int n = Integer.parseInt(br.readLine());
int [][] sticker = new int[2][n+1];
int[][] dp = new int[3][n + 1];
for(int i = 0; i < 2; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0; j < n; j++) {
sticker[i][j] = Integer.parseInt(st.nextToken());
}
}
dp[0][0] = 0; dp[1][0] = sticker[0][0];
dp[2][0] = sticker[1][0];
for(int i = 1; i <= n; i++) {
dp[0][i] = Math.max(Math.max(dp[0][i - 1], dp[1][i - 1]), dp[2][i - 1]);
dp[1][i] = Math.max(dp[0][i - 1], dp[2][i - 1]) + sticker[0][i];
dp[2][i] = Math.max(dp[0][i - 1], dp[1][i - 1]) + sticker[1][i];
}
sb.append(Math.max(Math.max(dp[0][n], dp[1][n]), dp[2][n])).append("\n");
}
System.out.print(sb.toString().trim());
}
}
회고
'Algorithm > 백준' 카테고리의 다른 글
[백준] Silver I. 쉬운 계단 수 (0) | 2024.06.22 |
---|---|
[백준] Silver I. 포도주 시식 (1) | 2024.06.22 |
[백준] Silver II. 가장 큰 증가하는 부분 수열 (0) | 2024.06.17 |
[백준] Silver II. 가장 긴 증가하는 부분 수열 (0) | 2024.06.17 |
[백준] Silver I. 쉬운 계단 수 (1) | 2024.06.15 |