Submission #1184860

#TimeUsernameProblemLanguageResultExecution timeMemory
1184860jerzykGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
87 ms178248 KiB
#include <bits/stdc++.h>

using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1'000'000'000'000'000'000LL;
const int II = 100'000'000;
const ll M = 1'000'000'007LL;
const int N = 403;
int dp[N][N][N][3], il[N][3], pos[N][3];
int tp[200];

void Solve()
{
    tp['R'] = 0; tp['G'] = 1; tp['Y'] = 2;
    int n;
    string s;
    cin >> n >> s;
    s = '#' + s;
    for(int i = 0; i <= n; ++i)
        for(int j = 0; j <= n; ++j)
            for(int r = 0; r <= 2; ++r) dp[0][i][j][r] = II;
    for(int r = 0; r <= 2; ++r) dp[0][0][0][r] = 0;
    for(int l = 1; l <= n; ++l)
    {
        int a = tp[(int)s[l]];
        for(int r = 0; r <= 2; ++r) il[l][r] = il[l - 1][r];
        ++il[l][a];
        pos[il[l][a]][a] = l;
    }
    for(int l = 1; l <= n; ++l)
    {
        for(int i = 0; i <= l; ++i)
            for(int j = 0; j <= l - i; ++j)
            {
                int k = l - i - j;
                if(i > il[n][0] || j > il[n][1] || k > il[n][2]) continue;
                for(int r = 0; r <= 2; ++r)
                    dp[l][i][j][r] = II;
                int p = pos[i][0];
                if(i > 0)
                    dp[l][i][j][0] = min(dp[l - 1][i - 1][j][1], dp[l - 1][i - 1][j][2]) + p + max(0, j - il[p][1]) + max(0, k - il[p][2]) - l;
                p = pos[j][1];
                if(j > 0)
                    dp[l][i][j][1] = min(dp[l - 1][i][j - 1][0], dp[l - 1][i][j - 1][2]) + p + max(0, i - il[p][0]) + max(0, k - il[p][2]) - l;
                p = pos[k][2];
                if(k > 0)
                    dp[l][i][j][2] = min(dp[l - 1][i][j][0], dp[l - 1][i][j][1]) + p + max(0, j - il[p][1]) + max(0, i - il[p][0]) - l;
                //cerr << l << " " << pos[i][0] << " " << dp[l][i][j][0] << " | " << j << " " << pos[j][1] << " " << dp[l][i][j][1] << " | " << k << " " << pos[k][2] << " " << dp[l][i][j][2] << "\n";
            }
    }
    int answer = II;
    for(int i = 0; i <= n; ++i)
        for(int j = 0; j <= n - i; ++j)
        {
            int k = n - i - j;
            if(i > il[n][0] || j > il[n][1] || k > il[n][2]) continue;
            for(int r = 0; r <= 2; ++r)
                answer = min(answer, dp[n][i][j][r]);
        }
    if(answer < II)
        cout << answer << "\n";
    else
        cout << -1 << "\n";
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //int t; cin >> t;
    //while(t--)
        Solve();

    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...