#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#include <iostream>
#include <vector>
using namespace std;
#define INF 0x7f7f7f7f
int r, g, y;
vector<int> rv, gv, yv;
int dp[201][201][201][3];
int val1[201][201][201];
int val2[201][201][201];
int val3[201][201][201];
int go(int rcnt, int gcnt, int ycnt, int pre)
{
if(rcnt == r && gcnt == g && ycnt == y)
return 0;
int& ret = dp[rcnt][gcnt][ycnt][pre];
if(ret != -1)
return ret;
ret = INF;
if(pre == 0)
{
if(gcnt < g)
ret = min(ret, go(rcnt, gcnt+1, ycnt, 1) + abs(rcnt+gcnt+ycnt-(gv[gcnt]+val2[gcnt][rcnt][ycnt])));
if(ycnt < y)
ret = min(ret, go(rcnt, gcnt, ycnt+1, 2) + abs(rcnt+gcnt+ycnt-(yv[ycnt]+val3[ycnt][rcnt][gcnt])));
}
else if(pre == 1)
{
if(rcnt < r)
ret = min(ret, go(rcnt+1, gcnt, ycnt, 0) + abs(rcnt+gcnt+ycnt-(rv[rcnt]+val1[rcnt][gcnt][ycnt])));
if(ycnt < y)
ret = min(ret, go(rcnt, gcnt, ycnt+1, 2) + abs(rcnt+gcnt+ycnt-(yv[ycnt]+val3[ycnt][rcnt][gcnt])));
}
else
{
if(rcnt < r)
ret = min(ret, go(rcnt+1, gcnt, ycnt, 0) + abs(rcnt+gcnt+ycnt-(rv[rcnt]+val1[rcnt][gcnt][ycnt])));
if(gcnt < g)
ret = min(ret, go(rcnt, gcnt+1, ycnt, 1) + abs(rcnt+gcnt+ycnt-(gv[gcnt]+val2[gcnt][rcnt][ycnt])));
}
return ret;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n; string s;
cin >> n >> s;
for(int i = 0; i < n; i++)
{
if(s[i] == 'R')
{
r++;
rv.push_back(i);
}
else if(s[i] == 'G')
{
g++;
gv.push_back(i);
}
else
{
y++;
yv.push_back(i);
}
}
if(r-1 > g+y || g-1 > r+y || y-1 > r+g)
{
cout << "-1\n";
return 0;
}
for(int i = 0; i <= r; i++)
for(int j = 0; j <= g; j++)
for(int k = 0; k <= y; k++)
dp[i][j][k][0] = dp[i][j][k][1] = dp[i][j][k][2] = -1;
for(int i = 0; i < r; i++)
{
int cnt1 = 0;
for(int j = 0; j <= g; j++)
{
int cnt2 = 0;
for(int k = 0; k <= y; k++)
{
val1[i][j][k] = cnt1+cnt2;
if(k < y && rv[i] < yv[k])
cnt2++;
}
if(j < g && rv[i] < gv[j])
cnt1++;
}
}
for(int i = 0; i < g; i++)
{
int cnt1 = 0;
for(int j = 0; j <= r; j++)
{
int cnt2 = 0;
for(int k = 0; k <= y; k++)
{
val2[i][j][k] = cnt1+cnt2;
if(k < y && gv[i] < yv[k])
cnt2++;
}
if(j < r && gv[i] < rv[j])
cnt1++;
}
}
for(int i = 0; i < y; i++)
{
int cnt1 = 0;
for(int j = 0; j <= r; j++)
{
int cnt2 = 0;
for(int k = 0; k <= g; k++)
{
val3[i][j][k] = cnt1+cnt2;
if(k < g && yv[i] < gv[k])
cnt2++;
}
if(j < r && yv[i] < rv[j])
cnt1++;
}
}
int ans = min(go(0, 0, 0, 0), min(go(0, 0, 0, 1), go(0, 0, 0, 2)));
if(ans == INF)
cout << "-1\n";
else
cout << ans << '\n';
}
# | 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... |