https://www.acmicpc.net/problem/2156
2156번: 포도주 시식
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규
www.acmicpc.net
* 문제
1부터 n까지의 번호가 붙어 있는 n개의 포도주 잔이 순서대로 테이블 위에 놓여 있고, 각 포도주 잔에 들어있는 포도주의 양이 주어졌을 때, 효주를 도와 가장 많은 양의 포도주를 마실 수 있도록 하라
* 풀이 방법
▶ n개의 포도주 잔이 있고, 시식하는 경우는 3가지임
i번째 잔을 선택하지 않고 지나가는 경우
i번째 잔을 선택해서 연속으로 1잔 마신 경우,
i번째 잔을 선택해서 연속으로 2잔 마신 경우
▶ n*3의 dp배열 생성 ( i : n개의 잔에 각각의 양이 담긴 배열의 인덱스 ) ( j : 시식하는 경우의 수 인덱스 )
▶ 현재 잔을 안 마신 경우 ☞ dp[ i ][ 0 ] = Max( dp[ i-1 ][ 0 ], dp[ i-1 ][ 1 ], dp[ i-1 ][ 2 ] )
현재 잔까지 연속으로 1잔 마신 경우 ☞ dp[ i ][ 1 ] = dp[ i-1 ][ 0 ] + a[ i ];
현재 잔까지 연속으로 2잔 마신 경우 ☞ dp[ i ][ 2 ] = dp[ i-1 ][ 1 ] + a[ i ];
|
6 |
10 |
13 |
9 |
8 |
1 |
x |
0 |
6 |
16 |
23 |
28 |
33 |
1 |
6 |
10 |
19 |
25 |
31 |
29 |
2 |
(6) |
16 |
23 |
28 |
33 |
32 |
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), i;
int a[] = new int[n];
for( i = 0; i < n; i++ )
a[i] = sc.nextInt();
sc.close();
int dp[][] = new int[3][n];
dp[1][0] = a[0];
for( i = 1; i < n; i++ ) {
dp[0][i] = Math.max( dp[0][i-1], Math.max( dp[1][i-1], dp[2][i-1] ) );
dp[1][i] = dp[0][i-1] + a[i];
dp[2][i] = dp[1][i-1] + a[i];
}
System.out.println( Math.max( dp[0][n-1], Math.max( dp[1][n-1], dp[2][n-1] ) ) );
}
}
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 11054 : 가장 긴 바이토닉 부분 수열 / 동적 계획법 1 (0) | 2020.06.20 |
---|---|
[백준(Baekjoon)][자바(java)] 11053 : 가장 긴 증가하는 부분 수열 / 동적 계획법 1 (0) | 2020.06.19 |
[백준(Baekjoon)][자바(java)] 10844 : 쉬운 계단 수 / 동적 계획법 1 (0) | 2020.06.19 |
[백준(Baekjoon)][자바(java)]1463 : 1로 만들기 / 동적 계획법 1 (0) | 2020.06.19 |
[백준(Baekjoon)][자바(java)] 2579 : 계단 오르기 / 동적 계획법 1 (0) | 2020.06.19 |