Submission #1338340

#TimeUsernameProblemLanguageResultExecution timeMemory
1338340trungcanRastuci (COCI25_rastuci)C++20
15 / 110
1 ms1092 KiB
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int N = 5005;
const ll INF = 1e18;

int n, a[N], B[N][N];
ll dp[N][N], s[N];

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

    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i]; s[i] = s[i - 1] + a[i];
        for (int j = 0; j < i; ++j) dp[i][j] = INF;
    }

    dp[1][0] = a[B[1][0] = 1];
    for (int i = 1; i < n; ++i)
        for (int j = 0; j < i; ++j)
            if (dp[i][j] != INF){
                //ghep chung nhom voi nhom hien tai
                if (dp[i + 1][j + 1] > dp[i][j] + a[i + 1])
                    dp[i + 1][j + 1] = dp[i][j] + a[i + 1],
                    B[i + 1][j + 1] = B[i][j];
                //tao 1 nhom moi
                int l = i + 1, r = n, p = -1;
                while (l <= r){
                    int mid = l + ((r - l) >> 1);
                    if (s[mid] - s[i] >= dp[i][j]){
                        p = mid;
                        r = mid - 1;
                    } else
                        l = mid + 1;
                }
                if (p != -1 && dp[p][j + p - i - 1] > s[p] - s[i]){
                    B[p][j + p - i - 1] = i + 1;
                    dp[p][j + p - i - 1] = s[p] - s[i];
                }
            }

//    for (int i = 1; i <= n; ++i)
//        for (int j = 0; j < i; ++j) if (dp[i][j] != INF)
//            cout << i << " " << j << "\t" << dp[i][j] << "\n";

    for (int i = 0; i < n; ++i)
        if (dp[n][i] != INF){

            cout << n - i << "\n";

            stack<int> st;
            int cur = i, id = n;
            while (id){
                st.push(dp[id][cur]);
                int nc = cur - (id - B[id][cur]);
                id = B[id][cur] - 1;
                cur = nc;
//                cerr << "\t" << cur << "\n";
            }

            while (!st.empty()) cout << st.top() << " ", st.pop();

            return 0;
        }
}
#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...