제출 #769960

#제출 시각아이디문제언어결과실행 시간메모리
769960LittleCubeChorus (JOI23_chorus)C++17
40 / 100
7081 ms99140 KiB
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;

int N, K;
ll dp[5005][5005], in[1000006], suf[1000006], tot;
char c[2000006];

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> N >> K;
    for (int i = 1; i <= 2 * N; i++)
        cin >> c[i];
    for (int i = 1, j = 0, k = 1; i <= N; i++, k++)
    {
        while (c[k] != 'B')
            j++, k++;
        in[i - 1] = j;
    }
    for (int i = 0; i < N; i++)
        in[i] = max((ll)i, in[i]);
    for (int i = 1, j = N, k = 1; i <= N; i++, k++)
    {
        while (c[k] != 'A')
            j--, k++;
        suf[i] = j;
    }
    for (int i = N; i >= 0; i--)
        suf[i] += suf[i + 1];

    for (int k = 0; k <= K; k++)
        for (int i = 0; i <= N; i++)
            dp[i][k] = 1e18;
    dp[0][0] = 0;
    for (int k = 1; k <= K; k++)
        for (int i = 1; i <= N; i++)
        {
            for (int j = 0; j < i; j++)
                if (in[j] < i)
                    dp[i][k] = min(dp[i][k], dp[j][k - 1] + (i - in[j]) * (N - j) - (suf[in[j] + 1] - suf[i + 1]));
                else
                    dp[i][k] = min(dp[i][k], dp[j][k - 1] + 0);
            // cout << dp[i][k] << " \n"[i == N];
        }
    cout << dp[N][K] << '\n';
}
#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...