Submission #1089063

#TimeUsernameProblemLanguageResultExecution timeMemory
1089063DeathIsAweGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++17
100 / 100
76 ms185064 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long ll dp[401][401][401][3], prefix[400][3]; string plants; int main() { int n; cin >> n; cin >> plants; int rsum = 0, gsum = 0, ysum = 0; for (char i: plants) { if (i == 'R') {rsum++;} if (i == 'G') {gsum++;} if (i == 'Y') {ysum++;} } if (max(max(rsum, gsum), ysum) * 2 > rsum + gsum + ysum + 1) { cout << -1; return 0; } vector<int> rvec, gvec, yvec; int rcount = 0, gcount = 0, ycount = 0; for (int i=0;i<n;i++) { if (plants[i] == 'R') { rcount++; rvec.push_back(i); } if (plants[i] == 'G') { gcount++; gvec.push_back(i); } if (plants[i] == 'Y') { ycount++; yvec.push_back(i); } prefix[i][0] = rcount; prefix[i][1] = gcount; prefix[i][2] = ycount; } int rpos, gpos, ypos; string curplants; for (int i=0;i<rsum+1;i++) { for (int j=0;j<gsum+1;j++) { for (int k=0;k<ysum+1;k++) { if (i == 0 && j == 0 && k == 0) {continue;} if (i + j + k == 1) { dp[i][j][k][0] = INT32_MAX; dp[i][j][k][1] = INT32_MAX; dp[i][j][k][2] = INT32_MAX; if (i == 1) { dp[i][j][k][0] = 0; } else if (j == 1) { dp[i][j][k][1] = 0; } else { dp[i][j][k][2] = 0; } //cout << i << ' ' << j << ' ' << k << ": " << dp[i][j][k][0] << ' ' << dp[i][j][k][1] << ' ' << dp[i][j][k][2] << '\n'; continue; } dp[i][j][k][0] = INT32_MAX; dp[i][j][k][1] = INT32_MAX; dp[i][j][k][2] = INT32_MAX; if (i != 0) { rpos = max((ll)0, j - prefix[rvec[i - 1]][1]) + max((ll)0, k - prefix[rvec[i - 1]][2]); if (dp[i - 1][j][k][1] != -1) { dp[i][j][k][0] = min(dp[i][j][k][0], rpos + dp[i - 1][j][k][1]); } if (dp[i - 1][j][k][2] != -1) { dp[i][j][k][0] = min(dp[i][j][k][0], rpos + dp[i - 1][j][k][2]); } } if (j != 0) { gpos = max((ll)0, i - prefix[gvec[j -1]][0]) + max((ll)0, k - prefix[gvec[j - 1]][2]); if (dp[i][j - 1][k][0] != -1) { dp[i][j][k][1] = min(dp[i][j][k][1], gpos + dp[i][j - 1][k][0]); } if (dp[i][j - 1][k][2] != -1) { dp[i][j][k][1] = min(dp[i][j][k][1], gpos + dp[i][j - 1][k][2]); } } if (k != 0) { ypos = max((ll)0, j - prefix[yvec[k -1]][1]) + max((ll)0, i - prefix[yvec[k - 1]][0]); if (dp[i][j][k - 1][0] != -1) { dp[i][j][k][2] = min(dp[i][j][k][2], ypos + dp[i][j][k - 1][0]); } if (dp[i][j][k - 1][1] != -1) { dp[i][j][k][2] = min(dp[i][j][k][2], ypos + dp[i][j][k - 1][1]); } } //cout << i << ' ' << j << ' ' << k << ": " << dp[i][j][k][0] << ' ' << dp[i][j][k][1] << ' ' << dp[i][j][k][2] << '\n'; } } } ll ans = INT32_MAX; ans = min(ans, min(dp[rsum][gsum][ysum][0], min(dp[rsum][gsum][ysum][1], dp[rsum][gsum][ysum][2]))); 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...