Submission #1171452

#TimeUsernameProblemLanguageResultExecution timeMemory
1171452chikien2009Growing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
60 ms162888 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int n, f[401][401][401][3], pre[3][401];
vector<int> p[3];
string s;

int main()
{
    setup();

    cin >> n >> s;
    s = '#' + s;
    p[0] = {0};
    p[1] = {0};
    p[2] = {0};
    for (int i = 1; i <= n; ++i)
    {
        if (s[i] == 'R')
        {
            p[0].push_back(i);
        }
        else if (s[i] == 'G')
        {
            p[1].push_back(i);
        }
        else
        {
            p[2].push_back(i);
        }
        pre[0][i] = p[0].size();
        pre[1][i] = p[1].size();
        pre[2][i] = p[2].size();
    }
    for (int i = 0; i < p[0].size(); ++i)
    {
        for (int j = 0; j < p[1].size(); ++j)
        {
            for (int k = 0; k < p[2].size(); ++k)
            {
                if (i + j + k == 0)
                {
                    f[i][j][k][0] = f[i][j][k][1] = f[i][j][k][2] = 0;
                    continue;
                }
                f[i][j][k][0] = f[i][j][k][1] = f[i][j][k][2] = 2e9;
                if (0 < i)
                {
                    f[i][j][k][0] = min(f[i - 1][j][k][1], f[i - 1][j][k][2]) + p[0][i] - i - j - k;
                    f[i][j][k][0] += max(0, pre[1][p[1][j]] - pre[1][p[0][i]]);
                    f[i][j][k][0] += max(0, pre[2][p[2][k]] - pre[2][p[0][i]]);
                }
                if (0 < j)
                {
                    f[i][j][k][1] = min(f[i][j - 1][k][0], f[i][j - 1][k][2]) + p[1][j] - i - j - k;
                    f[i][j][k][1] += max(0, pre[0][p[0][i]] - pre[0][p[1][j]]);
                    f[i][j][k][1] += max(0, pre[2][p[2][k]] - pre[2][p[1][j]]);
                }
                if (0 < k)
                {
                    f[i][j][k][2] = min(f[i][j][k - 1][0], f[i][j][k - 1][1]) + p[2][k] - i - j - k;
                    f[i][j][k][2] += max(0, pre[0][p[0][i]] - pre[0][p[2][k]]);
                    f[i][j][k][2] += max(0, pre[1][p[1][j]] - pre[1][p[2][k]]);
                }
                if (i + j + k == n)
                {
                    n = min({f[i][j][k][0], f[i][j][k][1], f[i][j][k][2]});
                }
            }
        }
    }
    cout << (n > 1e9 ? -1 : n);
    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...