https://www.acmicpc.net/problem/2156
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
/******** 전역변수 ********/
/******** 함 수 ********/
int main(void) {
/******** C++ INIT ********/
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
/******** 지역변수 ********/
int input1;
int input2;
vector<int> v;
vector<int> v2;
/******** 구 현 ********/
cin >> input1;
for (int i = 0; i < input1; i++) {
cin >> input2;
v.push_back(input2);
}
// 점화식 : 1번 포도주
v2.push_back(v[0]);
if (input1 == 1) {
cout << *max_element(v2.begin(), v2.end());
return 0;
}
// 점화식 : 2번 포도주 = 1번+2번
v2.push_back(v[0] + v[1]);
if (input1 == 2) {
cout << *max_element(v2.begin(), v2.end());
return 0;
}
// 점화식 : 3번 포도주 = 1번+3번 / 2번+3번 중 최대값
v2.push_back(max(v[0] + v[2], v[1] + v[2]));
if (input1 == 3) {
cout << *max_element(v2.begin(), v2.end());
return 0;
}
// 점화식 : 4번 포도주 = 1번+2번+4번 / 1번+3번+4번 중 최대값
v2.push_back(max(v[0] + v[1] + v[3], v[0]+ v[2] + v[3]));
if (input1 == 4) {
cout << *max_element(v2.begin(), v2.end());
return 0;
}
// 5번부터 최대 포도주 값 계산
for (int i = 4; i < v.size(); i++) {
// 현재 포도주 + 바로 뒤 포도주 + 뒤쪽 3번째 포도주의 최대값
// 현재 포도주 + 뒤쪽 2번째 포도주의 최댁밧
// 현재 포도주 + 바로 뒤 포도주 + 뒤쪽 4번째 포도주의 최대값
// 위 3가지 값 중 최대값을 벡터에 삽입
v2.push_back(
max(
max(v[i] + v[i - 1] + v2[i - 3], v[i] + v2[i - 2])
,v[i] + v[i - 1] + v2[i - 4])
);
}
// 벡터 내 가장 큰 값 : 최대로 마실 수 있는 포도주량
cout << *max_element(v2.begin(), v2.end());
}
'알고리즘' 카테고리의 다른 글
C++ 알고리즘 - 17478 재귀함수가 뭔가요? (1) | 2025.02.10 |
---|---|
C++ 알고리즘 - 2559 수열 (0) | 2025.01.28 |
C++ 알고리즘 - 1932 정수 삼각형 (0) | 2025.01.24 |
C++ 알고리즘 - 1149 RGB 거리 (0) | 2025.01.24 |
C++ 알고리즘 - 18115 카드 놓기 (0) | 2025.01.24 |