🔗 포도주 시식
효주는 포도주 시식회에 갔다. 그곳에는 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 다음과 같은 규칙이 있다:
효주를 도와 가장 많은 양의 포도주를 마실 수 있도록 하자.
6
6
10
13
9
8
1
33
이 문제는 이전 상태를 기반으로 현재 상태를 결정하는 동적 계획법(DP)을 활용하여 해결할 수 있습니다.
dp[i]: i번째 포도주 잔까지 고려했을 때 마실 수 있는 포도주의 최대 양dp[i] = max(
dp[i - 1], // 현재 잔을 마시지 않는 경우
dp[i - 2] + arr[i], // 이전 잔을 건너뛰고 현재 잔을 마시는 경우
dp[i - 3] + arr[i - 1] + arr[i] // 전전 잔 마시고, 이전 + 현재 잔을 마시는 경우
)
입력: 6 10 13 9 8 1
dp[1] = 6dp[2] = 6 + 10 = 16dp[3] = max(16, 6 + 13, 0 + 10 + 13) = 23dp[4] = max(23, 16 + 9, 6 + 13 + 9) = 28dp[5] = max(28, 23 + 8, 16 + 9 + 8) = 33dp[6] = max(33, 28 + 1, 23 + 8 + 1) = 33👉 최종 답: 33
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N + 1];
int[] dp = new int[N + 1];
for (int i = 1; i <= N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
dp[1] = arr[1];
if (N > 1) {
dp[2] = arr[1] + arr[2];
}
for (int i = 3; i <= N; i++) {
dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + arr[i], dp[i - 3] + arr[i - 1] + arr[i]));
}
System.out.println(dp[N]);
}
}