제출 #1163333

#제출 시각아이디문제언어결과실행 시간메모리
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...