문제 출처
1. 문제설명
- 효주가 포도주 시식을 하려고 하는데 두 가지 규칙이 있다.
- 어떤 잔을 선택하면 전부 마셔야 한다.
- 연속으로 놓인 3잔을 마실 수 없다.
- 각 포도주 잔에 양이 주어졌을 때 최대로 많이 마실 수 있는 양을 구하라
2. 알고리즘 설계
- DP 문제
- 핵심은 연속으로 놓인 3잔을 마실 수 없다는 것
- 즉 4개의 잔이 있을 때,
- 1번째 잔, 3번째 잔, 4번째 잔을 마신 경우
- 2번째 잔, 4번째 잔을 마신 경우를 비교하면 된다.
- 주의할 건 N번째 잔의 최대 값을 계산했는데, N-1번째 잔의 값이 클 수 있다.
- 따라서, N번째 잔 계산 이후
N vs N-1
을 해줘야 한다.
3. 로직
- 점화식
DP[i] = max(DP[i - 3] + arr[i - 1] + arr[i], DP[i - 2] + arr[i]);
DP[i] = max(DP[i], DP[i-1])
4. 전체 코드
#include <bits/stdc++.h>
using namespace std;
const int SZ = 100001;
int DP[SZ];
int arr[SZ];
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
int n; cin >> n;
for (int i = 1; i <= n; i++)
cin >> arr[i];
DP[1] = arr[1];
DP[2] = DP[1] + arr[2];
for (int i = 3; i <= n; i++) {
DP[i] = max(DP[i - 3] + arr[i - 1] + arr[i], DP[i - 2] + arr[i]);
DP[i] = max(DP[i - 1], DP[i]);
}
cout << DP[n];
return 0;
}