포도주 시식
26 July 2019
문제 : https://www.acmicpc.net/problem/2156
이번은 규칙에 따라 포도주를 마실 때, 최대로 마실 수 있는 포도주의 양을 구하는 문제를 풀어보도록 하겠습니다.
#include<stdio.h>
#define max(a,b) (((a)>(b))?(a):(b))
#define MAX(a,b,c) (((max(a,b))>(c))?(max(a,b)):(c))
static int** dp;
int main(void) {
int N, val;
scanf("%d", &N);
dp = new int*[N];
for (int i = 0; i < N; i++)
{
dp[i] = new int[3];
}
for (int i = 0; i < N; i++)
{
scanf("%d", &val);
if (i == 0)
{
dp[0][0] = 0;
dp[0][1] = val;
dp[0][2] = val;
}
else
{
dp[i][0] = MAX(dp[i-1][0], dp[i - 1][1], dp[i - 1][2]);
dp[i][1] = dp[i-1][0] + val;
dp[i][2] = dp[i-1][1] + val;
}
}
printf("%d\n", MAX(dp[N - 1][0], dp[N - 1][1], dp[N - 1][2]));
return 0;
}
문제의 조건에 연속으로 3개를 먹을 수 없다고 하였으므로, 다음과 같이 3가지 경우의 최대값이 생길 수 있습니다.첫번째, 현재의 것을 포함해서 연속으로 0개를 먹은 경우 => 지금 포도주를 안 먹음 두번째, 현재의 것을 포함해서 연속으로 1개를 먹은 경우 => 바로 이전 포도주는 먹지 않고, 현재의 것을 먹음 세번째, 현재의 것을 포함해서 연속으로 2개를 먹은 경우 => 바로 이전 포도주를 먹고, 현재의 것도 먹음 각각의 최대값을 계산해준 후, 3개 중 가장 큰 값을 return해주도록 합니다.