Submission #499621

#TimeUsernameProblemLanguageResultExecution timeMemory
499621MarceantasyGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++17
100 / 100
175 ms145456 KiB
#include <bits/stdc++.h>
using namespace std; 

#define ll long long
#define ar array

const int mxN = 410, M = 1e9+7; 
int n, dp[4][210][210][210], sum[3][mxN], cnt[3];
string s;
vector<int> a[3];

int solvepos(char c, int pos){
    if(c == 'R'){
        return sum[0][pos+1];
    }
    if(c == 'G'){
        return sum[1][pos+1];
    }
    return sum[2][pos+1];
}

int cost(int flag, int R, int G, int Y){
    int pos;
    if(flag == 0){
        pos = a[flag][R-1];
    }
    if(flag == 1){
        pos = a[flag][G-1];
    }
    if(flag == 2){
        pos = a[flag][Y-1];
    }
    return max(solvepos('R', pos) - R, 0) + max(solvepos('G', pos) - G, 0) + max(solvepos('Y', pos) - Y, 0);
}

int solve(int last, int R, int G, int Y){
    if(R+G+Y == 0){
        return 0;
    }
    if(~dp[last][R][G][Y]) return dp[last][R][G][Y];
    int flag = 1e9;
    if(R && last != 0){
        flag = min(flag, solve(0, R-1, G, Y) + cost(0, R, G, Y));
    }
    if(G && last != 1){
        flag = min(flag, solve(1, R, G-1, Y) + cost(1, R, G, Y));
    }
    if(Y && last != 2){
        flag = min(flag, solve(2, R, G, Y-1) + cost(2, R, G, Y));
    }
    return dp[last][R][G][Y] = flag;
}

int main(){
#ifdef _DEBUG
//	freopen("input.txt", "r", stdin);
//	freopen("output.txt", "w", stdout);
#endif
    std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);

    cin >> n >> s;
    for(int i = n-1; i>=0; --i){
        if(s[i] == 'R'){
            cnt[0]++;
            a[0].push_back(i);
            sum[0][i]++;
        }else if(s[i] == 'G'){
            cnt[1]++;
            a[1].push_back(i);
            sum[1][i]++;
        }else{
            cnt[2]++;
            a[2].push_back(i);
            sum[2][i]++;
        }
        for(int j = 0; j<3; ++j){
            sum[j][i] += sum[j][i+1];
        }
    }
    memset(dp, -1, sizeof(dp));
    if(max(cnt[0], max(cnt[1], cnt[2])) > 202){
        cout << "-1\n";
    }else{
        int ans = solve(3, cnt[0], cnt[1], cnt[2]);
        if(ans >= 1e8){
            cout << "-1\n";
        }else{
            cout << ans << "\n";
        }
    }
}

Compilation message (stderr)

joi2019_ho_t3.cpp: In function 'int cost(int, int, int, int)':
joi2019_ho_t3.cpp:14:26: warning: 'pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
   14 |         return sum[0][pos+1];
      |                       ~~~^~
joi2019_ho_t3.cpp:23:9: note: 'pos' was declared here
   23 |     int pos;
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...