BOJ 백준 2156 : 포도주 시식

Updated:

시작하면서

이번 문제는 다이나믹 프로그래밍(Dynamic Programming) 카테고리 문제이다.

BOJ 2156 - 포도주 시식

문제 이해

​ 이 문제에서 포도주 잔의 개수가 10,000개이므로 무작정 모든 경우의 수를 전부 계산하면 시간 초과가 발생한다. 중요한 부분은 연속으로 놓여 있는 3잔을 모두 마실 수는 없다 조건이다. 연속으로 마실 수 있는 경우의 수가 0잔, 1잔, 2잔으로 제한되어있으므로 각 와인을 마시는 경우의 수를 저장하면서 문제를 해결한다.

해결

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
   // sync off
   ios::sync_with_stdio(false);
   cin.tie(0);
   cout.tie(0);
   // sync off

   vector<int> amountOfWine;
   vector<vector<int>> dp;
   int n;

   cin >> n;
   amountOfWine.resize(n);
   dp.resize(3);
   dp[0].resize(n, 0);
   dp[1].resize(n, 0);
   dp[2].resize(n, 0);

   for (int i = 0; i < n; i++)
   {
      cin >> amountOfWine[i];
   }

   dp[0][0] = 0;
   dp[1][0] = amountOfWine[0];
   dp[2][0] = amountOfWine[0];

   dp[0][1] = max({ dp[0][0], dp[1][0], dp[2][0] });
   dp[1][1] = amountOfWine[1];
   dp[2][1] = amountOfWine[0] + amountOfWine[1];

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

   cout << max({ dp[0][n - 1], dp[1][n - 1],dp[2][n - 1] });

   return 0;
}

Tags:

Categories:

Updated:

Leave a comment