Submission #99089

#TimeUsernameProblemLanguageResultExecution timeMemory
99089gs14004Growing Vegetable is Fun 3 (JOI19_ho_t3)C++17
100 / 100
386 ms171772 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 405; using lint = long long; using pi = pair<int, int>; int n; char str[MAXN]; int dp[222][222][222][4]; vector<int> rep[3]; int sum[3][MAXN]; int cntAfter(char arg, int pos){ if(arg == 'R') return sum[0][pos + 1]; if(arg == 'G') return sum[1][pos + 1]; if(arg == 'Y') return sum[2][pos + 1]; assert(0); } int cost(int cR, int cG, int cY, int mode){ int pos = -1; if(mode == 0) pos = rep[mode][cR-1]; if(mode == 1) pos = rep[mode][cG-1]; if(mode == 2) pos = rep[mode][cY-1]; return max(cntAfter('R', pos) - cR, 0) + max(cntAfter('G', pos) - cG, 0) + max(cntAfter('Y', pos) - cY, 0); } int f(int cR, int cG, int cY, int prv){ if(cR + cG + cY == 0) return 0; if(~dp[cR][cG][cY][prv]) return dp[cR][cG][cY][prv]; int ret = 1e9; if(cR > 0 && prv != 0){ ret = min(ret, f(cR - 1, cG, cY, 0) + cost(cR, cG, cY, 0)); } if(cG > 0 && prv != 1){ ret = min(ret, f(cR, cG - 1, cY, 1) + cost(cR, cG, cY, 1)); } if(cY > 0 && prv != 2){ ret = min(ret, f(cR, cG, cY - 1, 2) + cost(cR, cG, cY, 2)); } return dp[cR][cG][cY][prv] = ret; } int main(){ cin >> n >> str; memset(dp, -1, sizeof(dp)); int cntr = count(str, str + n, 'R'); int cntg = count(str, str + n, 'G'); int cnty = count(str, str + n, 'Y'); if(max({cntr, cntg, cnty}) > 202){ puts("-1"); return 0; } for(int i=n-1; i>=0; i--){ if(str[i] == 'R'){ rep[0].push_back(i); sum[0][i]++; } if(str[i] == 'G'){ rep[1].push_back(i); sum[1][i]++; } if(str[i] == 'Y'){ rep[2].push_back(i); sum[2][i]++; } for(int j=0; j<3; j++) sum[j][i] += sum[j][i+1]; } int ans = f(cntr, cntg, cnty, 3); if(ans > 1e8) ans = -1; cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...