Algorithm

[백준] 포도주 시식 2156번 (c++)

salmon16 2021. 12. 8. 10:42

출처 : 2156번: 포도주 시식 (acmicpc.net)

 

2156번: 포도주 시식

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

www.acmicpc.net

풀이 방법

현재 인덱스 포도주를 기준으로 몇 번 연속인지 계산하면 문제를 쉽게 풀이할 수 있다.

0번째 연속인 경우 dp[i] = dp[i-1] // i번째 포도주를 마시지 않는 경우

1번째 연속인 경우 dp[i] = dp[i-2] + wine[i] // i-2 번째 dp에서 i-1번째 포도주를 건너뛰고 i번째 포도주를 마신 경우

2번째 연속인 경우 dp[i] = dp[i-3] + wine[i-1] + wine[i]  //i-3 dp에서 i-2 번째 포도주를 건너뛰고 i-1번째 포도주를 마시고 i번째 포도주를 마신 경우

3가지 경우 중 최대 값을 dp[i]에 넣어 주면 된다.

1번째 2번째 연속인 경우에서 포도주를 건너뛰는 이유는 이전 dp에서 연속되는 경우를 피하기 위해서 한번 건너뛰고 다음 포도주를 마신 거다

//12865
#include <bits/stdc++.h>
using namespace std ;

int n;
int dp[10001];
int wine[10001] = {0, };



int main () {
    cin >> n;
    for (int i = 1;i <= n;i++) {
        cin >> wine[i];
    }
    dp[0] = 0;
    dp[1] = wine[1];
    dp[2] = wine[1] + wine[2];
    for (int i = 3;i <= n;i++) {
        dp[i] = max(dp[i-1], max(dp[i-2] + wine[i], dp[i-3] + wine[i-1] + wine[i]));
    }
    cout << dp[n];
    return 0;
}

'Algorithm' 카테고리의 다른 글

[백준] 토마토 7569번 (c++)  (0) 2022.02.24
[백준] 쉬운 계단 수 10844번 (c++)  (0) 2021.12.15
[백준] 치즈 2638번 (c++)  (0) 2021.12.01
[백준] 내리막 길 1520번 (c++)  (0) 2021.10.28
[백준] 나이트의 이동 7562번 (c++)  (0) 2021.10.26