본문으로 바로가기

2156 포도주 시식

category ps/다이나믹 프로그래밍 2021. 7. 16. 22:06

 

풀이코드

#include <iostream>
#include <cstdio>
using namespace std;
#define MAX 10000
// 2156

int max(int a, int b) {return a > b ? a : b;}
int max(int a, int b, int c){
	return max(a, b) < c ? c : max(a, b);
}

int main(){
	int n;
	int wine[MAX + 1], dp[MAX + 1][3];
	
	cin >> n;
	cin.ignore();
	
	for(int i = 1; i <= n; i++) cin >> wine[i];
	
	dp[1][0] = 0; 		// 마시지 않는다.
	dp[1][1] = wine[1];	// 마신다.
	dp[1][2] = 0;		// 2번 마신다.
	
	for(int i = 2; i <= n; i++){
		// 1. 마시지 않는다
		dp[i][0] = max(dp[i - 1][0], dp[i - 1][1], dp[i - 1][2]);
		// 2. 마신다
		dp[i][1] = dp[i - 1][0] + wine[i];
		// 3. 연속으로 마신다.
		dp[i][2] = dp[i - 1][1] + wine[i];
	}
	cout << max(dp[n][0], dp[n][1], dp[n][2]) << endl;;

}

 

해설

1. 마시지 않는다

2. 마신다.

3. 연속으로 마신다.

라는 세 가지의 선택지로 나누어 dp 를 진행할 수 있다.

각 선택지의 점화식을 생각해서 구현해보았다

.

반응형

'ps > 다이나믹 프로그래밍' 카테고리의 다른 글

11055 가장 큰 증가 부분 수열  (0) 2021.07.16
11053 가장 긴 증가하는 부분 수열 ★  (0) 2021.07.16
9465 스티커  (0) 2021.07.14
2193 이친수  (0) 2021.07.11
11057 오르막수  (0) 2021.07.11