제출 #1181360

#제출 시각아이디문제언어결과실행 시간메모리
1181360anteknneGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
0 / 100
0 ms324 KiB
#include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; #define pb push_back #define pii pair<int, int> #define pll pair<ll, ll> #define st first #define nd second #define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> #define debug false string s; const int MAXN = 400; vector<int> v; int dp[MAXN][MAXN][MAXN][3]; int spref[MAXN][3]; int gdzie[MAXN][3]; int cnt[3]; int main () { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n >> s; s = "#" + s; v.pb(-1); memset(gdzie[0], -1, sizeof(gdzie[0])); memset(gdzie[1], -1, sizeof(gdzie[1])); memset(gdzie[2], -1, sizeof(gdzie[2])); for (int i = 1; i <= n; i ++) { if (s[i] == 'R') { v.pb(0); } else if (s[i] == 'G') { v.pb(1); } else { v.pb(2); } for (int k = 0; k < 3; k ++) { spref[i][k] = spref[i - 1][k]; } spref[i][v[i]] ++; cnt[v[i]] ++; gdzie[cnt[v[i]]][v[i]] = i; cout << cnt[v[i]] << " " << v[i] << ": " << i << "\n"; } for (int i = 1; i <= n; i ++) { for (int j = 0; j <= i; j ++) { for (int k = 0; k <= i - j; k ++) { for (int l = 0; l < 3; l ++) { dp[i][j][k][l] = INT_MAX; } } } } for (int i = 0; i <= n - 1; i ++) { for (int j = 0; j <= i; j ++) { for (int k = 0; k <= i - j; k ++) { int l = i - j - k; //dp[i + 1][j + 1][k][0] = min(dp[i][j][k][1]) //DODAJ 0 int x = gdzie[j + 1][0]; if (x != -1 && min(dp[i][j][k][1], dp[i][j][k][2]) != INT_MAX) { x += max(0, k - spref[x][1]) + max(0, l - spref[x][2]); dp[i + 1][j + 1][k][0] = min(dp[i + 1][j + 1][k][0], min(dp[i][j][k][1], dp[i][j][k][2]) + max(0, x - (i + 1))); } //DODAJ 1 x = gdzie[k + 1][1]; if (x != -1 && min(dp[i][j][k][0], dp[i][j][k][2]) != INT_MAX) { x += max(0, j - spref[x][0]) + max(0, l - spref[x][2]); dp[i + 1][j][k + 1][1] = min(dp[i + 1][j][k + 1][1], min(dp[i][j][k][0], dp[i][j][k][2]) + max(0, x - (i + 1))); } //DODAJ 2 x = gdzie[l + 1][2]; if (x != -1 && min(dp[i][j][k][0], dp[i][j][k][1]) != INT_MAX) { x += max(0, j - spref[x][0]) + max(0, k - spref[x][1]); dp[i + 1][j][k][2] = min(dp[i + 1][j][k][2], min(dp[i][j][k][0], dp[i][j][k][1]) + max(0, x - (i + 1))); } } } } for (int i = 1; i <= n; i ++) { for (int j = 0; j <= i; j ++) { for (int k = 0; k <= i - j; k ++) { for (int l = 0; l < 3; l ++) { //cout << i << " " << j << " " << k << " " << l << ": " << dp[i][j][k][l] << "\n"; } } } } int minn = INT_MAX; for (int l = 0; l < 3; l ++) { minn = min(minn, dp[n][spref[n][0]][spref[n][1]][l]); } if (minn == INT_MAX) { cout << -1 << "\n"; } else { cout << minn << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...