끄적끄적 코딩
article thumbnail

 

다이나믹 프로그래밍 문제입니다.

 

연속으로 3개의 포도주를 마시지 않으면서 최대한 많이 포도주를 마셨을때의 값을 찾는 문제입니다.

1. 현재 포도주를 안 먹었을 때

2. 현재 포도주를 먹지 않았고 이전 포도주를 먹었을 때

3. 현재 포도주와 이전 포도주 둘 다 먹었을 때

이렇게 3가지로 나타낼 수 있습니다.

 

코드로 작성하면

memo[i] = memo[i-1];

memo[i] = memo[i-2] + drink[i];

memo[i] = memo[i-3] + drink[i-1] + drink[i-2];

 

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

int memo[10010];
int drink[10010];
void init()
{
   for (int i = 0; i < 10010; ++i) {
      drink[i] = 0;
      memo[i] = 0;
   }
}

int main(int argc, char *argv[])
{
   init();
   int n;
   cin >> n;

   for (int i = 0; i < n; ++i) {
      cin >> drink[i];
   }
   memo[0] = drink[0];
   memo[1] = drink[0] + drink[1];
   for (int i = 2; i < n; ++i) {
      memo[i] = max(memo[i - 1], max(memo[i - 2] + drink[i], memo[i - 3] + drink[i - 1] + drink[i]));
   }

   cout << memo[n - 1];
   return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 10844번 쉬운 계단 수  (0) 2019.05.18
[C++] 백준 1912번 연속합  (0) 2019.05.17
[C++] 백준 1003번 피보나치 함수  (0) 2019.05.17
[C++] 백준 1932번 정수 삼각형  (0) 2019.05.17
[C++] 백준 2193번 이친수  (0) 2019.05.17

검색 태그