Submission #1168930

#TimeUsernameProblemLanguageResultExecution timeMemory
1168930brintonChorus (JOI23_chorus)C++20
40 / 100
7095 ms79432 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf (long long)(1e15)
signed main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    //start here
    int N,k;cin >> N >> k;
    vector<vector<int>> dp(k+1,vector<int>(N+1,inf));
    string s;cin >> s;
    {// init k;
        int Acnt = 0;
        int Bcnt = 0;
        int curSwap = 0;
        dp[1][0] = 0;
        for(auto i:s){
            if(i == 'A'){
                curSwap += Bcnt;
                Acnt++;
                dp[1][Acnt] = curSwap; 
            }else{
                Bcnt++;
            }
        }
    }
    for(int l = 1;l <= k-1;l++){
        // push to next layer;
        for(int i = 0;i <= N;i++){
            // chose d additional;
            string ns;
            {// create ns
                int Acnt = 0;
                int Bcnt = 0;
                for(auto c:s){
                    if(c == 'A'){
                        if(Acnt >= i) ns.push_back('A');
                        Acnt++;
                    }else{
                        if(Bcnt >= i) ns.push_back('B');
                        Bcnt++;
                    }
                }
            }
            {// push
                int Acnt = 0;
                int Bcnt = 0;
                int curSwap = 0;
                dp[l+1][i] = min(dp[l+1][i],dp[l][i]);
                // cout << l << " " << i << ":" << ns << endl;
                for(auto c:ns){
                    if(c == 'A'){
                        curSwap += Bcnt;
                        Acnt++;
                        dp[l+1][i+Acnt] = min(dp[l+1][i+Acnt],curSwap+dp[l][i]); 
                    }else{
                        Bcnt++;
                    }
                }
            }
        }
    }
    int ans = inf;
    for(int l = 1;l <= k;l++){
        ans = min(ans,dp[l][N]);
    }
    // //! debug;
    // for(int l =  1;l <= k;l++){
    //     for(int i = 1;i <= N;i++){
    //         cout << dp[l][i] << " ";
    //     }
    //     cout << endl;
    // }
    // cout << endl;
    // //! debug end
    cout << ans;
}
// AAAABBBBAB
#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...