접근방법
- DP는 어려웡
- 현재 포도주에 대한 3가지 행동을 할 수 있다.
- 이전에 쉬고 마시기 ( 그 이전까지 최대 값을 가져옴 )
- 이전에 마시기 ( 이건 이전에 먹으면 그 이전에 한번 쉬고 온것 까지 계산해야됨)
- 안 마시기 ( 이전의 최대값 그대로 가져옴 )
입 / 출력
입력 | 3 1 1 0 |
3 1 0 1 |
3 0 1 1 |
1 1 |
2 1 2 |
4 5 5 5 5 |
5 0 0 10 0 0 |
출력 | 2 | 2 | 2 | 1 | 3 | 15 | 10 |
코드
더보기
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 포도주_시식 {
public static void main(String[] arg) throws IOException {
// BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
int amountOfWine[] = new int[n];
for (int i = 0; i < n; i++) {
amountOfWine[i] = Integer.parseInt(reader.readLine());
}
if (n == 1) {
// 와인이 1잔일 때는 그 1잔만 마신다.
System.out.println(amountOfWine[0]);
return;
} else if (n == 2) {
// 와인이 2잔일 때는 두 잔 모두 마시는 것이 최대
System.out.println(amountOfWine[0] + amountOfWine[1]);
return;
}
int[] dp = new int[n];
dp[0] = amountOfWine[0];
dp[1] = amountOfWine[0] + amountOfWine[1];
dp[2] = Math.max(dp[1], Math.max(amountOfWine[0] + amountOfWine[2], amountOfWine[1] + amountOfWine[2]));
for (int i = 3; i < n; i++) {
dp[i] = Math.max(dp[i - 3] + amountOfWine[i - 1] + amountOfWine[i], dp[i - 2] + amountOfWine[i]);
dp[i] = Math.max(dp[i], dp[i - 1]);
}
System.out.println(dp[n - 1]);
}
}
'개인 공부 > 백준' 카테고리의 다른 글
11652번 카드 ( JAVA ) (1) | 2024.09.09 |
---|---|
11401번 이항 계수 3 (1) | 2024.09.08 |
2580번 스도쿠 ( JAVA ) (1) | 2024.09.03 |
14888번 연산자 끼워넣기 ( JAVA ) (1) | 2024.09.02 |
2346번 풍선 터뜨리기 ( JAVA ) (0) | 2024.09.01 |