https://www.acmicpc.net/problem/2156
해당 문제는 다이나믹 프로그래밍 문제로, 포도주가 1 ~ n잔까지 있을 때 마실 수 있는 포도주의 최대량을 dp 배열에 차례대로 갱신하는 Bottom-Up 방식으로 풀었다.
1) n
에 포도주 잔의 개수를 입력 받아 저장하고, 벡터 glasses
를 선언해 포도주 양을 차례대로 입력받아 삽입한다.
2) 1차원 배열 dp
를 선언하고, dp[1]은 glasses[1], dp[2]는 glasses[1] + [2]로 초기화한다.
3) i가 3 ~ n일 때까지 최대량을 전부 갱신한다.
4) dp[n]에 n잔까지 있을 때 마실 수 있는 포도주의 최대량이 저장되므로, 이를 출력한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int dp[10001];
vector<int> glasses;
int solution()
{
dp[1] = glasses[1];
dp[2] = glasses[1] + glasses[2];
for (int i = 3; i <= n; i++)
dp[i] = max({ dp[i - 1], dp[i - 3] + glasses[i - 1] + glasses[i], dp[i - 2] + glasses[i] });
return dp[n];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n;
glasses.push_back(0);
for (int i = 0; i < n; i++)
{
int num;
cin >> num;
glasses.push_back(num);
}
cout << solution();
}