6
100 100 1 1 100 100
출력: 301
정답: 400
다시 해설로 돌아오겠습니다.
DP[n]
: 1번 포도주부터 n번 포도주까지 있을 때 마실 수 있는 최대 포도주 량DP[n] = max(DP[n - 1], max(DP[n - 2], DP[n - 3] + a[n - 1]) + a[n])
DP[n - 1]
을 그대로 가져오는 것: n번째 포도주를 마시지 않는 것을 의미.DP[n - 2] + a[n]
: 1칸 움직인 뒤 n번째 포도주를 마시는 것을 의미.DP[n - 3] + a[n - 1] + a[n]
: 2칸 움직인 뒤 n번째 포도주를 마시는 것을 의미.#include <bits/stdc++.h>
using namespace std;
int N, A[10'001], DP[10'001];
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> N;
for (int i = 1; i <= N; ++i) cin >> A[i];
DP[1] = A[1]; DP[2] = A[1] + A[2];
for (int i = 3; i <= N; ++i)
DP[i] = max(DP[i - 1], max(DP[i - 2], DP[i - 3] + A[i - 1]) + A[i]);
cout << DP[N];
}