πŸ•οΈ ICPC Sinchon/Dynamic Programming

[BOJ S1][C++] λ°±μ€€ 2156번: 포도주 μ‹œμ‹

선달 2022. 9. 30. 04:52
λ°˜μ‘ν˜•

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

 

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

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

www.acmicpc.net

 

문제

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

  1. 포도주 μž”μ„ μ„ νƒν•˜λ©΄ κ·Έ μž”μ— λ“€μ–΄μžˆλŠ” ν¬λ„μ£ΌλŠ” λͺ¨λ‘ λ§ˆμ…”μ•Ό ν•˜κ³ , λ§ˆμ‹  ν›„μ—λŠ” μ›λž˜ μœ„μΉ˜μ— λ‹€μ‹œ 놓아야 ν•œλ‹€.
  2. μ—°μ†μœΌλ‘œ 놓여 μžˆλŠ” 3μž”μ„ λͺ¨λ‘ λ§ˆμ‹€ μˆ˜λŠ” μ—†λ‹€.

νš¨μ£ΌλŠ” 될 수 μžˆλŠ” λŒ€λ‘œ λ§Žμ€ μ–‘μ˜ 포도주λ₯Ό 맛보기 μœ„ν•΄μ„œ μ–΄λ–€ 포도주 μž”μ„ 선택해야 할지 κ³ λ―Όν•˜κ³  μžˆλ‹€. 1λΆ€ν„° nκΉŒμ§€μ˜ λ²ˆν˜Έκ°€ λΆ™μ–΄ μžˆλŠ” n개의 포도주 μž”μ΄ μˆœμ„œλŒ€λ‘œ ν…Œμ΄λΈ” μœ„μ— 놓여 있고, 각 포도주 μž”μ— λ“€μ–΄μžˆλŠ” ν¬λ„μ£Όμ˜ 양이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 효주λ₯Ό 도와 κ°€μž₯ λ§Žμ€ μ–‘μ˜ 포도주λ₯Ό λ§ˆμ‹€ 수 μžˆλ„λ‘ ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 

예λ₯Ό λ“€μ–΄ 6개의 포도주 μž”μ΄ 있고, 각각의 μž”μ— μˆœμ„œλŒ€λ‘œ 6, 10, 13, 9, 8, 1 만큼의 포도주가 λ“€μ–΄ μžˆμ„ λ•Œ, 첫 번째, 두 번째, λ„€ 번째, λ‹€μ„― 번째 포도주 μž”μ„ μ„ νƒν•˜λ©΄ 총 포도주 양이 33으둜 μ΅œλŒ€λ‘œ λ§ˆμ‹€ 수 μžˆλ‹€.

μž…λ ₯

첫째 쀄에 포도주 μž”μ˜ 개수 n이 주어진닀. (1 ≤ n ≤ 10,000) λ‘˜μ§Έ 쀄뢀터 n+1번째 μ€„κΉŒμ§€ 포도주 μž”μ— λ“€μ–΄μžˆλŠ” ν¬λ„μ£Όμ˜ 양이 μˆœμ„œλŒ€λ‘œ 주어진닀. ν¬λ„μ£Όμ˜ 양은 1,000 μ΄ν•˜μ˜ 음이 μ•„λ‹Œ μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 μ΅œλŒ€λ‘œ λ§ˆμ‹€ 수 μžˆλŠ” ν¬λ„μ£Όμ˜ 양을 좜λ ₯ν•œλ‹€.

 

풀이

[🌲 Altu-Bitu/0927 λ™μ κ³„νšλ²•] - [BOJ][C++] λ°±μ€€ 2579번: 계단 였λ₯΄κΈ°

μœ„ λ¬Έμ œμ™€ 거의 λ™μΌν•œλ°, λ§ˆμ§€λ§‰κ³„λ‹¨μ„ κΌ­ λ°Ÿμ•„μ•Όν•œλ‹€λŠ” 쑰건만 μ œμ™Έν•œλ‹€.

λ°˜λ³΅λ¬Έμ„ 돌릴 λ•Œ ν˜„μž¬ 포도주λ₯Ό λ§ˆμ‹  버전과 λ§ˆμ‹œμ§€ μ•Šμ€ 버전 두가지λ₯Ό λΉ„κ΅ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ•Όν•œλ‹€.

dp[i] = max(dp[i-1], dp[i]);

 

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <deque>

using namespace std;

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

int main() {
    int n;
    cin >> n;
    vector<int> wine(n,0);
    for(int i=0; i<n; i++)
        cin >> wine[i];
    
    cout << maxWine(n, wine);
    
    return 0;
}

/*
 */

 

λ°˜μ‘ν˜•