Baekjoon

[백준 DP] 2156번 - 포도주 시식

yujin0517 2022. 12. 18. 20:46

2156번 - 포도주 시식 

 

<문제>

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

 

2156번: 포도주 시식

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규

www.acmicpc.net

 

<문제 풀이>

arr[] -> 문제에서 입력 받은 포도주의 용량을 저장

dp[][] -> 선택한 포도주 잔의 용량의 합을 저장 

점화식
dp[0][i] = max(dp[1][i-1], dp[2][i-1]) + arr[i]
dp[1][i] = max(dp[0][i-2], dp[1][i-2], dp[2][i-2]) + arr[i]
dp[2][i] = max(dp[0][i-3], dp[1][i-3], dp[2][i-3]) + arr[i]

 

<코드>

더보기
#include <iostream>
#include <algorithm>
#define MAX 10001
using namespace std;

int T;
int arr[MAX];
int dp[3][MAX];
int m0, m1, m2;


int maxSum() {

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

	int size = sizeof(arr) / sizeof(*arr);
	for (int i = 1; i <= T; i++) {
		m0 = *max_element(dp[0], dp[0] + size);
		m1 = *max_element(dp[1], dp[1] + size);
		m2 = *max_element(dp[2], dp[2] + size);
	}

	return max({ m0, m1, m2 });
}

int main() {
	cin >> T;

	for (int i = 1; i <= T; i++) {
		cin >> arr[i];
		if (i == 1) {
			dp[0][i] = arr[i]; dp[1][i] = arr[i]; dp[2][i] = arr[i];
		}
	}

	cout << maxSum() << endl;
	return 0;
}

 

<결과>

 

 

2022.12.18