Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

hwooo

BOJ (C/C++) 2156번: 포도주 시식 본문

Study/Algorithm

BOJ (C/C++) 2156번: 포도주 시식

hwooo 2023. 3. 23. 06:10

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

 

2156번: 포도주 시식

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

www.acmicpc.net


풀이

3잔을 연속으로 마시면 안 되므로 3번째 잔부터 조건을 고려해줌

?OOX - DP[i-1]

?XOO - DP[i-3]+wine[i-1]+wine[i]

?OXO - DP[i-2]+wine[i]

 

i번째 순서에 최대값이 나올 조건은 위의 3개이므로 이를 고려하여 DP로 코드를 구현

 

밑의 링크의 설명이 자세해서 문제 풀 때 도움을 많이 얻었다!

https://yabmoons.tistory.com/512

 

[ 백준 2156 ] 포도주 시식 (C++)

백준의 포도주 시식(2156) 문제이다.[ 문제 바로가기 ] [ 문제풀이 ]간단한 예시를 통해서, 포도주를 어떻게 마셨을 때, 가장 최대로 마실 수 있는지 알아보자.5개의 포도주 잔이 있고, 그 5개의 잔

yabmoons.tistory.com


코드

#include <stdio.h>
int Max(int a, int b) {
	if (a > b) return a;
	return b;
}
int main() {
	int n;
	int wine[10000], DP[10000];
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", &wine[i]);

	DP[1] = wine[1], DP[2] = wine[1] + wine[2];

	for (int i = 3; i < n; i++) {
		DP[i] = Max(DP[i - 1], Max(DP[i - 3] + wine[i - 1] + wine[i], DP[i - 2] + wine[i]));
	}

	printf("%d", DP[n - 1]);
	return 0;
}