PS

BOJ 2616 : 소형기관차

lickelon 2024. 5. 15. 21:28
  • 문제 링크 : boj.kr/2616
  • 난이도 : G3
  • 태그 : DP, 누적합

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;
    vector<int> arr(n+1);
    for(int i = 1; i <= n; i++) {
        cin >> arr[i];
        arr[i] += arr[i-1];
    }
    int k;
    cin >> k;
    vector<vector<int>> dp(n+1, vector<int>(3, 0));
    for(int i = 0; i <= n; i++) {
        if(i - k < 0) dp[i][0] = -1;
        else dp[i][0] = max(dp[i-1][0], arr[i]-arr[i-k]);
        if(i - k < 0 || dp[i-k][0] == -1) dp[i][1] = -1;
        else dp[i][1] = max(dp[i-1][1], dp[i-k][0] + arr[i]-arr[i-k]);
        if(i - k < 0 || dp[i-k][1] == -1) dp[i][2] = -1;
        else dp[i][2] = max(dp[i-1][2], dp[i-k][1] + arr[i]-arr[i-k]);
    }
    cout << dp[n][2];

    return 0;
}

풀이

dp[i][k] = i번째 객차까지 보았을 때, k개의 소형 기관차가 끌었을 때의 최댓값

위처럼 dp식을 놓고 문제를 풀면 된다.

현재 위치부터 k개의 객차를 끌었을 때의 값을 매번 구하면 비효율적이니 누적합 배열로 구해둔다.

'PS' 카테고리의 다른 글

BOJ 14370 : 전화번호 수수께끼 (Large)  (0) 2024.05.17
BOJ 23255 : 구름다리 2  (0) 2024.05.16
BOJ 31233 : 관광 상품  (0) 2024.05.14
BOJ 17073 : 나무 위의 빗물  (0) 2024.05.13
BOJ 28067 : 기하가 너무 좋아  (0) 2024.05.12