πŸ“ Coding Test Study/Algorithm Problem

[C++][BAEKJOON][DP] 2156번 포도주 μ‹œμ‹

ibelieveinme 2021. 8. 5. 23:17
728x90

[문제]

 

2156번: 포도주 μ‹œμ‹

νš¨μ£ΌλŠ” 포도주 μ‹œμ‹νšŒμ— κ°”λ‹€. κ·Έ 곳에 κ°”λ”λ‹ˆ, ν…Œμ΄λΈ” μœ„μ— λ‹€μ–‘ν•œ 포도주가 λ“€μ–΄μžˆλŠ” 포도주 μž”μ΄ 일렬둜 놓여 μžˆμ—ˆλ‹€. νš¨μ£ΌλŠ” 포도주 μ‹œμ‹μ„ ν•˜λ €κ³  ν•˜λŠ”λ°, μ—¬κΈ°μ—λŠ” λ‹€μŒκ³Ό 같은 두 κ°€μ§€ 규

www.acmicpc.net

 

[μ„€λͺ…]

β˜…μ΄ λ¬Έμ œκ°€ DP 인 이유: ν˜„μž¬ 값을 ꡬ할 λ•Œ 이전 결과값을 μ΄μš©ν•  수 μžˆλŠ” λͺ¨μ–‘이 λ‚˜μ˜€κΈ° λ•Œλ¬Έ

  •  ν¬λ„μ£Όκ°€ 1μž” 일 λ•Œ,
    1μž” λͺ¨λ‘λ₯Ό 선택해야 μ΅œλŒ€μ΄λ‹€.

 

  • 포도주가 2μž” 일 λ•Œ,
    2μž” λͺ¨λ‘λ₯Ό 선택해야 μ΅œλŒ€μ΄λ‹€.

 

  • 포도주가 3μž” 일 λ•Œ,
    3번째 μž”μ„ 선택할 κ²½μš°μ™€ μ„ νƒν•˜μ§€ μ•Šμ„ 경우둜 λ‚˜λˆŒ 수 μžˆλ‹€.
    이 λ•Œ, 3번째 μž”μ„ μ„ νƒν•˜μ§€ μ•Šμ„ κ²½μš°λŠ” 포도주가 2μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’κ³Ό κ°™λ‹€.
    3번째 μž”μ„ μ„ νƒν–ˆλ‹€λ©΄, 2번째 μž”μ„ μ„ νƒν•˜κ³  1번째 μž”μ„ μ„ νƒν•˜μ§€ μ•ŠλŠ” κ²½μš°μ™€ β–‘ β–  β– , 2번째 μž”μ„ μ„ νƒν•˜μ§€ μ•Šκ³  1번째 μž”μ„ μ„ νƒν•˜λŠ” 경우 2κ°€μ§€κ°€ μžˆλ‹€. β–  β–‘ β– 

 

  • 포도주가 4μž” 일 λ•Œ,
    4번쨰 μž”μ„ 선택할 κ²½μš°μ™€ μ„ νƒν•˜μ§€ μ•Šμ„ 경우둜 λ‚˜λˆŒ 수 μžˆλ‹€.
    4번째 μž”μ„ μ„ νƒν•˜μ§€ μ•ŠλŠ” κ²½μš°λŠ” 포도주가 3μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’κ³Ό κ°™λ‹€.
    4번째 μž”μ„ μ„ νƒν•˜λŠ” κ²½μš°λŠ” 3번째 μž”μ„ μ„ νƒν•˜κ³  1번째 μž”μ„ μ„ νƒν•˜λŠ” κ²½μš°μ™€(=포도주가 1μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’) β–  β–‘ β–  β– , 3번째 μž”μ„ μ„ νƒν•˜μ§€ μ•Šκ³  포도주가 2μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’μ„ μ΄μš©ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. β–  β–  β–‘ β– 

 

  • 포도주가 5μž” 일 λ•Œ,
    5번쨰 μž”μ„ 선택할 κ²½μš°μ™€ μ„ νƒν•˜μ§€ μ•Šμ„ 경우둜 λ‚˜λˆŒ 수 μžˆλ‹€.
    5번째 μž”μ„ μ„ νƒν•˜μ§€ μ•ŠλŠ” κ²½μš°λŠ” 포도주가 4μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’κ³Ό κ°™λ‹€.
    5번째 μž”μ„ μ„ νƒν•˜λŠ” κ²½μš°λŠ” 4번째 μž”μ„ μ„ νƒν•˜κ³  2번째 μž”μ„ μ„ νƒν•˜λŠ” κ²½μš°μ™€(=포도주가 2μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’) β–‘ β–  β–‘ β–  β– , 4번째 μž”μ„ μ„ νƒν•˜μ§€ μ•Šκ³  포도주가 3μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’μ„ μ΄μš©ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. (β–‘ β–  β–  β–‘ β– ), (β–  β–  β–‘ β–‘ β– ), (β–  β–‘ β–  β–‘ β– )

 

즉, ν˜„μž¬ 값을 ꡬ할 λ•Œ 이전 결과값을 μ΄μš©ν•  수 μžˆλŠ” λͺ¨μ–‘이 λ‚˜μ˜¨λ‹€.
그리고 μœ„μ˜ 과정을 μ ν™”μ‹μœΌλ‘œ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

 

  • 포도주가 Nμž” 일 λ•Œ,
    N번쨰 μž”μ„ 선택할 κ²½μš°μ™€ μ„ νƒν•˜μ§€ μ•Šμ„ 경우둜 λ‚˜λˆŒ 수 μžˆλ‹€.
    N번째 μž”μ„ μ„ νƒν•˜μ§€ μ•ŠλŠ” κ²½μš°λŠ” 포도주가 N-1μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’κ³Ό κ°™λ‹€.
    N번째 μž”μ„ μ„ νƒν•˜λŠ” κ²½μš°λŠ” N-1번째 μž”μ„ μ„ νƒν•˜κ³  N-3번째 μž”μ„ μ„ νƒν•˜λŠ” κ²½μš°μ™€(=포도주가 N-3μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’), N-1번째 μž”μ„ μ„ νƒν•˜μ§€ μ•Šκ³  포도주가 N-2μž” μ΄μ—ˆμ„ λ•Œ κ΅¬ν•œ μ΅œλŒ€κ°’μ„ ν™œμš©ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.
D[N] = max(D[N-1], A[N] + A[N-1] + D[N-3],A [N] + D[N-2])

 

[μ½”λ“œ]

#include <iostream>
#include <vector>
using namespace std;

void DrinkGrapeJuice(int*, int);
int Max(int, int, int);

int main() {
    int num = 0;
    int grape_juice[10001] = {0,};

    cin >> num;
    for (int i = 1; i <= num; i++) {
        cin >> grape_juice[i];
    }
    DrinkGrapeJuice(grape_juice, num);

    return 0;
}

void DrinkGrapeJuice(int *grape_juice, int num) {
    int dp[10001] = {0,};

    dp[1] = grape_juice[1];
    if (num >= 2) dp[2] = dp[1] + grape_juice[2];

    for (int i = 3; i <= num; i++) {
        dp[i] = Max(dp[i - 1], dp[i - 2] + grape_juice[i], dp[i - 3] + grape_juice[i - 1] + grape_juice[i]);
    }
    cout << dp[num];
}

int Max(int a, int b, int c) {
    return a > b ? (a > c ? a : c) : (b > c ? b : c);
}
728x90