제출 #1333567

#제출 시각아이디문제언어결과실행 시간메모리
1333567gelastropodStove (JOI18_stove)C++20
50 / 100
226 ms327680 KiB
#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
#define int long long

vector<vector<int>> dp;
vector<int> P;

void compute(int a, int b, int s, int e, int n) {
    if (a > b) return;
    int crntopt = -1;
    int m = (a + b) / 2;
    for (int i = s; i <= min(m - 1, e); i++) {
        int crnt = dp[n - 1][i] + P[m] - P[i + 1] + 1;
        if (dp[n][m] > crnt) {
            dp[n][m] = crnt;
            crntopt = i;
        }
    }
    compute(a, m - 1, s, crntopt, n);
    compute(m + 1, b, crntopt, e, n);
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int N, G, s, csum = 0; cin >> N >> G;
    dp.resize(G, vector<int>(N, 1e17));
    for (int i = 0; i < N; i++) {
        cin >> s;
        P.push_back(s);
    }
    for (int i = 0; i < N; i++) dp[0][i] = P[i] - P[0] + 1;
    for (int i = 0; i < G; i++) dp[i][0] = 1;
    for (int i = 1; i < G; i++)
        compute(0, N - 1, 0, N - 1, i);
    cout << dp.back().back() << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...