Submission #1163333

#TimeUsernameProblemLanguageResultExecution timeMemory
1163333tvgkGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
245 ms2372 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 4e2 + 7;
const ll inf = 1e18 + 7;

int n, cnt[4], pass[mxN][4];
ll dp[mxN][mxN][4], rem[4];
string s;
char chr[4] = {'Y', 'G', 'R'};
vector<int> vt[4];

ll step(vector<int> num, int k)
{
    k = vt[k][num[k]];
    int sum = 0;
    for (int i = 0; i < 3; i++)
        sum += min(num[i], pass[k][i]);

    return k - sum;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);

    cin >> n;
    cin >> s;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            pass[i][j] = cnt[j];

            if (s[i] == chr[j])
            {
                cnt[j]++;
                vt[j].push_back(i);
            }
        }
    }

    for (int j = 0; j < 3; j++)
        vt[j].push_back(n);

    for (int u = 0; u < 3; u++)
    {
        for (int j = 0; j <= cnt[0]; j++)
        {
            for (int i = 0; i <= cnt[1]; i++)
                dp[j][i][u] = inf;
        }
        dp[0][0][u] = 0;
    }

    for (int i = 0; i < n; i++)
    {

        for (int j = cnt[0]; j >= 0; j--)
        {
            for (int u = cnt[1]; u >= 0; u--)
            {
                if (j + u > i || i - u - j > cnt[2])
                {
                    dp[j][u][2] = dp[j][u][0] = dp[j][u][1] = inf;
                    continue;
                }

                dp[j + 1][u][0] = min({dp[j + 1][u][0], dp[j][u][1] + step({j, u, i - u - j}, 0), dp[j][u][2] + step({j, u, i - j - u}, 0)});
                dp[j][u + 1][1] = min({dp[j][u + 1][1], dp[j][u][0] + step({j, u, i - u - j}, 1), dp[j][u][2] + step({j, u, i - j - u}, 1)});
                dp[j][u][2] = min(dp[j][u][1] + step({j, u, i - u - j}, 2), dp[j][u][0] + step({j, u, i - u - j}, 2));
                dp[j][u][0] = dp[j][u][1] = inf;
            }
        }
    }

    ll ans = inf;
    for (int i = 0; i < 3; i++)
        ans = min(ans, dp[cnt[0]][cnt[1]][i]);
    if (ans == inf)
        cout << -1;
    else
        cout << ans;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...