[백준 실버1] 2156 : 포도주 시식

수민이슈·2023년 9월 27일
0

[C++] 코딩테스트

목록 보기
74/116
post-thumbnail

🖊️ 문제

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


🖊️ 풀이

dp..
열심히 막 .. 점화식을 세워봤으나
자꾸 실패했다. ....

수준 ...

슬펐다

실패작


#include <iostream>
using namespace std;

int dp[10'005][4];

int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int n;
	cin >> n;

	//dp[1][0] = 0;
	//dp[1][1] = 6;
	//dp[1][2] = 6;
	//
	//dp[2][0] = 0;
	//dp[2][1] = 10;
	//dp[2][2] = 6 + 10 = dp[1][1] + 10 = 16;

	//dp[3][0] = 16;
	//dp[3][1] = 6 + 13 = dp[1][2] + 13 = 19;
	//dp[3][2] = 10 + 13 = dp[2][1] + 13 = 23;

	//dp[4][0] = 23;
	//dp[4][1] = dp[2][2] + 9 = 16 + 9 = 25;
	//dp[4][2] = dp[3][1] + 9 = 19 + 9 = 28;

	//dp[5][0] = 28;
	//dp[5][1] = dp[3][2] + 8 = 23 + 8 = 31;
	//dp[5][2] = dp[4][1] + 8 = 25 + 8 = 33;

	//dp[6][0] = 33;
	//dp[6][1] = dp[4][2] + 1 = 28 + 1 = 29;
	//dp[6][2] = dp[5][1] + 1 = 31 + 1 = 32;

	int n1, n2;
	cin >> n1;
	cin >> n2;

	dp[1][1] = n1;
	dp[1][2] = n1;

	dp[2][1] = n2;
	dp[2][2] = n1 + n2;

	int cur;
	for (int i = 3; i <= n; i++) {
		cin >> cur;
		dp[i][1] = dp[i - 2][2] + cur;
		dp[i][2] = dp[i - 1][1] + cur;
		dp[i][0] = max(dp[i - 1][1], dp[i - 1][2]);
		dp[i][3] = max(dp[i][1], max(dp[i][2], dp[i][0]));
	}

	cout << dp[n][3] << endl;
}

점화식 자체를 잘못 세웠다.
나는..
i번째 수에 대해 최댓값들을 4개나 저장했다.
1. dp[i][0] : i-1번째 수까지의 최댓값
2. dp[i][1] : i-2번째 수를 선택하고 2번 선택했을 때 + 현재 값
3. dp[i][2] : i-1번째 수도 선택하고, i번째 수도 선택헀을 때

점화식 자체가 잘못됐다.

점화식을 세울 때
현재 상황에서 어떤 걸 저장해야 다음번에 추가 계산없을 수 있는지, 최댓값을 구해야 한다면 현재 상황에서의 최댓값을 구하자.


일단 포도주를 연속 3개가 안되니까

... [0][1][2][3] 이렇게 4개가 있다고 했을 때
가능한 수는
1. [3] + [2] + [0]까지의 최댓값
2. [3] + [1]까지의 최댓값
3. [2]까지의 최댓값

이렇게 된다.

#include <iostream>
using namespace std;

int arr[10'005];
int dp[10'005];

int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int n;
	cin >> n;

	for (int i = 1; i <= n; i++) 
		cin >> arr[i];

	dp[1] = arr[1];
	dp[2] = arr[1] + arr[2];

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

	cout << dp[n] << endl;
}

0개의 댓글