728x90
반응형
https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
꽤 재밌었던 DP 문제이다.
각 스티커를 골랐을 때 가능한 최대값을 구하고 마지막 열의 두 스티커 중 더 큰 값을 출력하면 된다.
쉽게 말해서 스티커를 뗄 때마다 그 상황에서 가장 큰 수를 구하는 것이다.
위 사진을 보자 첫번째 열에서 50을 떼어내면 무조건 50이 크고, 30을 떼어내면 30이 크다.
두번째 열에서는 10을 땔 경우 앞에서는 30을 떼어내고, 50을 땔 경우 앞에서는 50을 떼어내야 한다.
여기 까지는 어느정도 정해져 있다.
세번째 열을 보자. 100을 뗄 경우 두 가지 경우가 있다. 앞에서 50과 50을 뗀 경우, 혹은 30을 떼고 두번째 열에서는 아무것도 떼지 않았을 때이다.
70을 뗄 경우도 마찬가지이다. 앞에서 30과 10을 뗀 경우, 혹은 50을 떼고 두번째 열에서는 아무것도 떼지 않았을 경우이다.
위와 같은 두가지 경우만 각 상황에 dp를 적용해 해결하면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int T, n;
static int[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
StringTokenizer st;
T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
n = Integer.parseInt(br.readLine());
dp = new int[2][n + 1];
input = br.readLine();
st = new StringTokenizer(input);
for (int j = 1; j <= n; j++) {
dp[0][j] = Integer.parseInt(st.nextToken());
}
input = br.readLine();
st = new StringTokenizer(input);
for (int j = 1; j <= n; j++) {
dp[1][j] = Integer.parseInt(st.nextToken());
}
for (int j = 2; j <= n; j++) {
//두 가지 경우 비교
dp[0][j] += Math.max(dp[1][j - 1], dp[1][j - 2]);
dp[1][j] += Math.max(dp[0][j - 1], dp[0][j - 2]);
}
System.out.println(Math.max(dp[0][n], dp[1][n]));
}
}
}
728x90
반응형
'코테 > JAVA' 카테고리의 다른 글
[백준 2193 / JAVA] 이친수 (1) | 2024.01.22 |
---|---|
[백준 2294 / JAVA] 동전 2 (1) | 2024.01.21 |
[백준 1463 / JAVA] 1로 만들기 (0) | 2024.01.21 |
[백준 1270 / JAVA] DFS와 BFS (1) | 2024.01.20 |
[백준 1493 / JAVA] 박스 채우기 (0) | 2024.01.20 |