-
[C++] BOJ 2156번: 포도주 시식프로그래밍/알고리즘 PS 2020. 11. 27. 11:38
문제 풀이
dp를 이용하여 해당 포도주를 마셨을 때가 연속 1번 마신 경우, 연속 2번 마신 경우, 그리고 해당 포도주를 마시지 않은 경우 3가지로 나누어 문제를 풀어냈다.
코드
#include <bits/stdc++.h> using namespace std; int n; int arr[10006]; int dp1[10006]; // 1번 마셨을 때 int dp2[10006]; // 2번 마셨을 때 int dp3[10006]; // 안 마셨을 때 int result; void calcDp(int depth) { if (depth > n) return; if (depth == 1) { dp1[1] = arr[1]; dp2[1] = 0; dp3[1] = 0; } else { dp1[depth] = dp3[depth - 1] + arr[depth]; dp2[depth] = dp1[depth - 1] + arr[depth]; dp3[depth] = max(max(dp1[depth - 1], dp2[depth - 1]), dp3[depth - 1]); } calcDp(depth + 1); } int main(void) { cin.tie(nullptr); ios::sync_with_stdio(false); cin >> n; for (int i = 1; i <= n; i++) cin >> arr[i]; calcDp(1); result = max(max(dp1[n], dp2[n]), dp3[n]); cout << result << '\n'; return 0; }'프로그래밍 > 알고리즘 PS' 카테고리의 다른 글
[C++] BOJ 1912번: 연속합 (0) 2020.12.01 [C++] BOJ 11053번: 가장 긴 증가하는 부분 수열, 11055번: 가장 큰 증가 부분 수열,. 11722번: 가장 긴 감소하는 부분 수열 (0) 2020.11.30 [C++] BOJ 9465번: 스티커 (0) 2020.11.27 [C++] BOJ 11057번: 오르막 수 (0) 2020.11.26 [C++] BOJ 10844번: 쉬운 계단 수 (0) 2020.11.26