반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 2156 포도주 시식 본문

백준(Baekjoon) 문제

백준 2156 포도주 시식

huiung 2019. 2. 28. 15:19
반응형

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 포도주가 일렬로 놓여있을 때 가장 많은 포도주를 마실 수 있는 양을 구하는 문제입니다.

 

이때 연속으로 세잔의 포도주를 마실 수 없다는 조건이 있습니다. 따라서 i번째의 잔까지 왔을 때 가장 많은 포도주의 양을 구하기 위해서는

 

총 세가지 경우중 최대값을 찾아야 합니다.

 

1. i번째 포도주를 먹지 않는경우 -> dp[i-1]

2. i-1번째 포도주를 먹지 않고 i번째 포도주를 먹는 경우 -> dp[i-2] + grape[i]

3. i-1번째 포도주와 i번째 포도주를 먹는 경우 -> dp[i-3] + grape[i-1] + grape[i]

세가지의 식이 존재하고 이 세가지 중 가장 max값이 dp[i]가 됩니다.

 

 

#include <iostream>

using namespace std;

/*
	총 세가지의 경우 비교
	1. i번째 포도주를 먹지 않는경우 
	2. i-1번째 포도주를 먹지 않고  i번째 포도주를 먹는 경우 
	3. i-1번째 포도주와 i번째 포도주를 먹는 경우 
*/
int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n; cin >> n;
	int grape[10001];
	int dp[10001] = {0, };  
	for(int i = 0; i < n; i++)
		cin >> grape[i];
	
	dp[0] = grape[0];
	if(n == 1) {
		cout<<dp[0];
		return 0;
	}
	if(n >= 2)
		dp[1] = grape[0] + grape[1];
	if(n >= 3)
		dp[2] = max(max(dp[1], grape[0] + grape[2]) , grape[1] + grape[2]);
	
	for(int i = 3; i < n; i++) {
		dp[i] = max(max(dp[i-1], dp[i-2] + grape[i]), dp[i-3] + grape[i-1] + grape[i]);

	}

	cout<< dp[n-1];

	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 9461 파도반 수열  (0) 2019.03.05
백준 9252(LCS2)  (0) 2019.03.05
백준 10844 쉬운 계단 수  (0) 2019.02.27
백준 1463 1로 만들기  (0) 2019.02.27
백준 1005 ACM Craft  (0) 2019.02.27