Submission #1287566

#TimeUsernameProblemLanguageResultExecution timeMemory
1287566dex111222333444555Growing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
405 ms780444 KiB
#include <bits/stdc++.h>
const int MAXN = 405;
using namespace std;
template<class X, class Y> bool minimize(X &x, const Y &y){return x > y ? x = y, 1: 0;}
template<class X, class Y> bool maximize(X &x, const Y &y){return x < y ? x = y, 1: 0;}
int lenS, s[MAXN], dp[3][MAXN][MAXN][MAXN], pre[3][MAXN], pos[3][MAXN], freq[3], infINT = 1e9 + 712823;

int id(const char &c){
    if (c == 'R') return 0;
    if (c == 'G') return 1;
    return 2;
}

void input(){
    cin >> lenS;
    for(int i = 1; i <= lenS; i++){
        char c; cin >> c;
        s[i] = id(c);
    }
}

void init(){
    for(int i = 1; i <= lenS; i++){
        freq[s[i]]++;
        pos[s[i]][freq[s[i]]] = i;
        for(int type = 0; type < 3; type++)
            pre[type][i] = freq[type];
    }
}

int get(int c1, int c2){
    return c1 ^ c2 ^ 1 ^ 2 ^ 0;
}

int getRange(int type, int L, int R){
    if (L > R) return 0;
    return pre[type][R] - pre[type][L];
}

void solve(){
    init();
    memset(dp, 0x3f, sizeof dp);
    for(int i = 0; i < 3; i++) dp[i][0][0][0] = 0;
    for(int i = 0; i <= freq[0]; i++)
    for(int j = 0; j <= freq[1]; j++)
    for(int k = 0; k <= freq[2]; k++)
    for(int last = 0; last < 3; last++) if (dp[last][i][j][k] < infINT)
    for(int nxt = 0; nxt < 3; nxt++) if (last != nxt){
        int other = get(last, nxt);
        int idLast = (last == 0 ? i: (last == 1 ? j: k));
        int idNxt = (nxt == 0 ? i: (nxt == 1 ? j: k)) + 1;
        int idOther = (other == 0 ? i: (other == 1 ? j: k));
        int posLast = pos[last][idLast];
        int posNxt = pos[nxt][idNxt];
        int posOther = pos[other][idOther];
        int cost = getRange(last, posLast, posNxt) + getRange(other, posOther, posNxt);
        minimize(dp[nxt][i + (nxt == 0)][j + (nxt == 1)][k + (nxt == 2)], dp[last][i][j][k] + cost);
    }
    int res = infINT;
    for(int i = 0; i < 3; i++) minimize(res, dp[i][freq[0]][freq[1]][freq[2]]);
    cout << (res < infINT ? res: -1) << '\n';
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    input();
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...