Submission #516986

#TimeUsernameProblemLanguageResultExecution timeMemory
516986shrimb수열 (APIO14_sequence)C++17
50 / 100
2098 ms63472 KiB
#include"bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'

int dp[10001][201];
int dp2[10001][201];
int best[10001][201];
int best2[10001][201];

signed main() {
    int n, k;
    cin >> n >> k;
    assert(k < n);

    int a[n];
    int pref[n];
    int suff[n];
    for (int i = 0 ; i < n ; i++) {
        cin >> a[i];
        if (i) pref[i] = pref[i-1];
        else pref[i] = 0;
        pref[i] += a[i];
    }
    for (int i = n - 1 ; i >=  0 ;i--) suff[i] = (i < n - 1 ? suff[i + 1] : 0) + a[i];
    int mx1 = 0;
    for (int j = 0 ; j < k ; j++) {
        for (int i = 0 ; i < n ; i++) {
            if (j == 0) {
                if (j == k - 1) dp[i][j] = (i < n - 1 ? suff[i + 1] : 0) * pref[i];
                else dp[i][j] = 0;
                mx1 = max(mx1, dp[i][j]);
                continue;
            }
            dp[i][j] = -1e15;
            for (int l = 0 ; l < i ; l++) {
                int prod = pref[l] * (pref[i] - pref[l]);
                int v = dp[l][j-1] + prod;
                if (j == k - 1) v += (i < n - 1 ? suff[i + 1] : 0) * pref[i];
                if (v > dp[i][j]) {
                    dp[i][j] = v;
                    best[i][j] = l;
                }
            }
            mx1 = max(mx1, dp[i][j]);
        }
    }
    int mx2 = 0;
    for (int j = 0 ; j < k ; j++) {
        for (int i = n-1 ; i >= 0 ; i--) {
            if (j == 0) {
                if (j == k - 1) {
                    dp[i][j] = (i < n - 1 ? suff[i + 1] : 0) * pref[i];
                }
                else dp2[i][j] = 0;
                mx2 = max(mx2, dp2[i][j]);
                continue;
            }
            dp2[i][j] = -1e15;
            for (int l = n-1 ; l > i ; l--) {
                int prod = suff[l] * ((i < n - 1 ? suff[i + 1] : 0) - suff[l]);
                int v = dp2[l][j-1] + prod;
                if (j == k - 1) v += (i < n - 1 ? suff[i + 1] : 0) * pref[i];
                if (v > dp2[i][j]) {
                    dp2[i][j] = v;
                    best2[i][j] = l;
                }
            }
            mx2 = max(mx2, dp2[i][j]);
        }
    }
    // for (int i = 0 ; i < n ; i++) {
    //     for (int j = 0 ; j < k ; j++) {
    //         cout << dp2[i][j] << " ";
    //     }
    //     cout << endl;
    // }
    bool tag = 1;
    if (mx2 > mx1) {tag = 0;swap(mx2, mx1);swap(dp, dp2);swap(best, best2);}

    // cerr << tag << endl;

    int cur = 0;
    int kk = k - 1;
    for (int i = 0 ; i < n-1 ; i++) {
        if (dp[i][kk] == mx1) cur = i;
    }
    cout << mx1 << "\n";
    vector<int> v;
    while (kk >= 0) {
        v.push_back(cur + 1);
        cur = best[cur][kk--];
    }
    reverse(v.begin(), v.end());
    for (int i : v) cout << i << " ";
}

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:78:10: warning: variable 'tag' set but not used [-Wunused-but-set-variable]
   78 |     bool tag = 1;
      |          ^~~
#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...