본문 바로가기
Baekjoon/[Code.plus] 알고리즘 기초 1/2

[BOJ/백준] 2156 포도주 시식

by 해적거북 2021. 8. 5.
728x90

● [문제번호 2156] 포도주 시식

https://www.acmicpc.net/problem/2156

 

2156번: 포도주 시식

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규

www.acmicpc.net

 

● 알아야 할 것

: 다이나믹 프로그래밍

 

 

● 풀이 과정

: DP 풀이과정 (Bottom - Up)

1. 테이블 정의하기

→ dp[연속해서 마신 수][index] : index까지 마신 포도주의 최대 양

 

2. 점화식 찾기

→ dp[연속해서 마신 수][index] 값은

연속해서 마신 수 : 0 → 이전 index의 연속해서 마신 수가 0, 1, 2 중 최대

연속해서 마신 수 : 1 → 이전 index의 연속해서 마신수 0인 경우에 현재 index 포도주 양 추가

연속해서 마신 수 : 2 → 이전 index의 연속해서 마신수 1인 경우에 현재 index 포도주 양 추가

 

3. 초기값 정하기

→ 첫 열은 마시거나 안 마신 경우 이므로

dp[0][1] = 0;
dp[1][1] = grape[1];

 

예제 입력1 풀이과정

 

 

● 주의 할 것

: index에 헷갈릴 수 있으니 주의

 

 

● 참고 할 것

: NULL

 

 

● 풀이 코드

#include <bits/stdc++.h>

using namespace std;

// grape[index] : 포도주 양 저장
// dp[연속해서 마신 수][index] : index까지 마신 포도주의 최대 양
int grape[10001];
int dp[3][10001];
int N;

void drink()
{
    // 초기값 설정
    dp[0][1] = 0;
    dp[1][1] = grape[1];
    
    // 점화식
    for(int index = 2; index <= N; index++)
    {
        dp[0][index] = max(dp[0][index - 1], max(dp[1][index - 1], dp[2][index - 1]));
        dp[1][index] = dp[0][index - 1] + grape[index];
        dp[2][index] = dp[1][index - 1] + grape[index];
    }
}


int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin >> N;
    
    for(int n = 1; n <= N; n++)
        cin >> grape[n];
    
    drink();
    
    cout << max(dp[0][N], max(dp[1][N], dp[2][N]));
    
    return 0;
}

 

 

● [백준] - [알고리즘 기초 1/2] - [401 - 다이나믹 프로그래밍 1 (연습)] 문제집

번호 문제 번호 문제 이름 풀이 링크
1 15988 1, 2, 3 더하기 3 https://pirateturtle.tistory.com/214
2 1149 RGB거리 https://pirateturtle.tistory.com/215
3 1309 동물원 https://pirateturtle.tistory.com/216
4 11057 오르막 수 https://pirateturtle.tistory.com/217
5 9465 스티커 https://pirateturtle.tistory.com/218
6 2156 포도주 시식 https://pirateturtle.tistory.com/219
7 1932 정수 삼각형 https://pirateturtle.tistory.com/220
8 11055 가장 큰 증가 부분 수열 https://pirateturtle.tistory.com/221
9 11722 가장 긴 감소하는 부분 수열 https://pirateturtle.tistory.com/222
10 11054 가장 긴 바이토닉 부분 수열 https://pirateturtle.tistory.com/223
11 13398 연속합 2 https://pirateturtle.tistory.com/224
12 2133 타일 채우기 https://pirateturtle.tistory.com/225

 

728x90

댓글