Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

MG

[백준] 2156 - 포도주 시식 본문

컴퓨터과학/알고리즘_PS

[백준] 2156 - 포도주 시식

MG# 2022. 5. 6. 20:49

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

 

2156번: 포도주 시식

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

www.acmicpc.net

전형적인 dp문제이다. dp[i]는 i번째 포도주에 도달했을때 가장 많이 마신 양이다. 그렇다면 두 가지 방법으로 나뉠 수 있다. 첫번째로 i번째를 마셨을때이다. 이를 마셨다면 또 두가지로 나뉜다. 이전 포도주를 마셨냐 안 마셨냐이다. 마셨다면 3번 연속으로 못 마시기에 dp[i - 3]과 이전 포도주, 현재 포도주를 다 더해준다. 이전 포도주를 안 마셨다면 dp[i - 2]와 현재 포도주를 더해준다. 그리고 마지막으로 안 마셨을때를 고려해 dp[i - 1]까지 비교해 총 3가지를 비교해 최댓값을 대입한다.

#include <iostream>
#define MAX 10001
using namespace std;

int dp[MAX], arr[MAX];
int n;

int main() {

    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> arr[i];

    dp[0] = 0;
    dp[1] = arr[1];
    dp[2] = arr[1] + arr[2];

    for (int i = 3; i <= n; i++) {
        dp[i] = max(dp[i - 3] + arr[i - 1] + arr[i], dp[i - 2] + arr[i]);
        dp[i] = max(dp[i - 1], dp[i]);
    }

    cout << dp[n] << "\n";
    return 0;
}

'컴퓨터과학 > 알고리즘_PS' 카테고리의 다른 글

[백준] 1043 - 거짓말  (0) 2022.05.16
[백준] 2293 - 동전 1  (0) 2022.05.10
[백준] 2407 - 조합  (0) 2022.05.05
[백준] 2294 - 동전 2  (0) 2022.05.04
[백준] 1629 - 곱셈  (0) 2022.05.04