티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/2616

 

2616번: 소형기관차

첫째 줄에 기관차가 끌고 가던 객차의 수가 입력된다. 그 수는 50,000 이하이다. 둘째 줄에는 기관차가 끌고 가던 객차에 타고 있는 손님의 수가 1번 객차부터 차례로 입력된다. 한 객차에 타고 있

www.acmicpc.net

 

풀이

3대의 기관차가 항상 같은 수의 객차를 끌게 됩니다.

결국 N개중 3개의 시작점을 골라 최댓값을 뽑는 문제라고 생각할 수 있습니다.

 

기관차가 끌 수 있는 객차의 수만큼 구간을 잡고, 그 합을 미리 계산해두면 편하게 구현할 수 있습니다.

 

정답 코드

#include <bits/stdc++.h>

using namespace std;

int d[55'555][3];
int n, k, p[55'555], sum[55'555];

int go(int i, int cnt) {
    if (cnt == 3) return 0;
    if (i >= n) return 0;
    int &ret = d[i][cnt];
    if (ret != -1) return ret;

    ret = max(go(i + 1, cnt), sum[i] + go(i + k, cnt + 1));
    return ret;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> p[i];
    }
    cin >> k;
    for (int i = 0; i < k; i++) {
        sum[0] += p[i];
    }
    for (int i = 1; i + k - 1 < n; i++) {
        sum[i] = sum[i - 1] - p[i - 1] + p[i + k - 1];
    }

    memset(d, -1, sizeof(d));
    cout << go(0, 0);
}
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함