Submission #1271289

#TimeUsernameProblemLanguageResultExecution timeMemory
1271289bbldrizzy수열 (APIO14_sequence)C++20
0 / 100
1 ms320 KiB
#include <bits/stdc++.h>
#include <ios>
#include <iostream>
using namespace std;
using ll = long long;
using P = pair<int, int>;
#define f first
#define s second
const int MOD = 1e9+7;
const ll MX = 4*1e18;
vector<ll> pref;
vector<vector<ll>> dp;
ll st = -1;

void solve(ll id, ll i, ll j, ll l, ll r) {
    if (i > j) return;
    ll mid = (i+j)/2;
    ll mx = 0;
    ll best = l;
    for (ll k = l; k <= min(mid, r); k++) {
        ll v = dp[k][id-1] + pref[k+1]*(pref[mid+1]-pref[k+1]); 
        // ll v = dp[k-1][id-1] + cost[k][mid];
        if (v > mx) {
            best = k;
            mx = v;
        }
    }
    dp[mid][id] = mx;
    // cout << "mid, best, mn: " << mid << ", " << best << ", " << mn << "\n";
    // cout << "dp[best][id-1]: " << dp[best][id-1] << "\n";
    solve(id, i, mid-1, l, best);
    solve(id, mid+1, j, best, r);
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    ll n, k; cin >> n >> k;
    vector<ll> v(n);
    for (auto &x: v) cin >> x;
    dp.assign(n+1, vector<ll>(k+2));
    pref.assign(n+1, 0);
    for (int i = 0; i < n; i++) {
        pref[i+1] = pref[i] + v[i];
    }
    for (int i = 1; i <= k; i++) {
        solve(i, 0, n-1, 0, n-1);
    }
    cout << dp[n-1][k];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...