# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
922461 | vjudge1 | Growing Vegetable is Fun 3 (JOI19_ho_t3) | C++17 | 505 ms | 780628 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define MP make_pair
#define pb push_back
#define REP(i,n) for(int (i) = 0; (i) < (n); (i)++)
void fastio() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
}
const double EPS = 0.00001;
const int INF = 1e9+500;
const int N = 405;
const int ALPH = 26;
const int LGN = 25;
const int MOD = 1e9+7;
int n,m,q;
int dp[N][N][N][3];
vector<int> s;
vector<int> p[3];
int mxs[3];
vector<int> plac[3]; // 1 - indexed
void find_oth(int x, vector<int> &oth) {
oth.clear();
for(int i = 0; i<3; i++) {
if(i == x) continue;
oth.pb(i);
}
}
void reset() {
REP(i,N) REP(j,N) REP(k,N) REP(t,3) {
dp[i][j][k][t] = INF;
}
}
inline void solve() {
cin>>n;
string tmp;
cin>>tmp;
s.assign(n+3, -1);
for(int i = 0; i<n; i++) {
if(tmp[i] == 'R') s[i + 1] = 0;
if(tmp[i] == 'G') s[i + 1] = 1;
if(tmp[i] == 'Y') s[i + 1] = 2;
}
reset();
REP(i,3) {
p[i].assign(n+2, 0);
p[i][0] = 0;
plac[i].pb(0);
dp[0][0][0][i] = 0;
}
for(int i = 1; i<=n; i++) {
plac[ s[i] ].pb(i);
}
for(int t = 0; t<3; t++) {
for(int i = 1; i<=n; i++) {
p[t][i] = p[t][i - 1] + (s[i] == t);
}
mxs[t] = p[t][n];
}
for(int i = 1; i<=n; i++) {
array<int,3> cnt;
for(cnt[0] = 0; cnt[0] <= mxs[0]; cnt[0]++) {
for(cnt[1] = 0; cnt[1] <= mxs[1]; cnt[1]++) {
if(cnt[1] + cnt[0] > i) break;
cnt[2] = i - cnt[0] - cnt[1];
if(cnt[2] > mxs[2]) continue;
for(int cur = 0; cur<3; cur++) {
if(cnt[cur] == 0) continue;
int ind = plac[cur][cnt[cur]];
int bef = 0;
for(int t = 0; t<3; t++) {
bef += min(p[t][ind - 1], cnt[t] - (t == cur));
}
int aft = i - 1 - bef;
int nwind = ind + aft;
int cost = nwind - i;
vector<int> lst;
find_oth(cur, lst);
int prcnt[3];
for(int t = 0; t<3; t++) {
prcnt[t] = cnt[t];
if(t == cur) prcnt[t]--;
}
for(auto el : lst) {
dp[i][cnt[0]][cnt[1]][cur] = min(dp[i][cnt[0]][cnt[1]][cur], cost + dp[i - 1][prcnt[0]][prcnt[1]][el]);
}
}
}
}
}
int ans = INF;
for(int i = 0; i<3; i++) ans = min(dp[n][mxs[0]][mxs[1]][i], ans);
if(ans == INF) ans = -1;
cout<<ans<<"\n";
}
signed main() {
fastio();
int test = 1;
//cin>>test;
while(test--) {
solve();
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |