이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//IN THE NAME OF GOD
#include<bits/stdc++.h>
//#pragma GCC optimize("O2,unroll-loops")
//#pragma GCC target("sse4")
#define endl '\n'
#define F first
#define S second
#define pii pair<int,int>
#define mp make_pair
#define all(x) x.begin(),x.end()
#define pb push_back
#define fast_io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define file_io freopen("input.in" , "r" , stdin) ; freopen("output.out" , "w" , stdout);
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
typedef long double dll;
const int N = 207, inf=1e9;
int A[N*2], dp[3][N][N][N],sum[3][N*2], te[3], po[3][N*2];
int32_t main(){
fast_io;
int n; cin>>n;
string s; cin>>s; s='#'+s;
for(int i=1; i<=n; i++){
if(s[i]=='R'){
A[i]=0;
te[0]++;
po[0][te[0]]=i;
}
else if(s[i]=='G'){
A[i]=1;
te[1]++;
po[1][te[1]]=i;
}
else{
A[i]=2;
te[2]++;
po[2][te[2]]=i;
}
}
if(te[0]>(te[1]+te[2]+1)||te[1]>(te[0]+te[2]+1)||te[2]>(te[0]+te[1]+1)) return cout<<-1<<endl,0;
for(int i=0; i<3; i++){
for(int j=1; j<=n; j++) sum[i][j]=sum[i][j-1]+(A[j]==i);
}
for(int id=0; id<3; id++) for(int a=0; a<N; a++) for(int b=0; b<N; b++) for(int c=0; c<N; c++) dp[id][a][b][c]=inf;
for(int i=0; i<3; i++) dp[i][0][0][0]=0;
for(int a=0; a<=te[0]; a++){
for(int b=0; b<=te[1]; b++){
for(int c=0; c<=te[2]; c++){
for(int now=0; now<3; now++){
for(int lst=0; lst<3; lst++){
if(lst==now||(a==te[0]&&now==0)||(b==te[1]&&now==1)||(c==te[2]&&now==2)) continue;
int po0,po1,po2,fa,mn=dp[lst][a][b][c];
if(lst==0){
po0=po[0][a];
po1=(now==1?po[1][b+1]:po[2][c+1]);
po2=(now==1?po[2][c]:po[1][b]);
fa=(now==1?2:1);
}
else if(lst==1){
po0=po[1][b];
po1=(now==0?po[0][a+1]:po[2][c+1]);
po2=(now==0?po[2][c]:po[0][a]);
fa=(now==0?2:0);
}
else{
po0=po[2][c];
po1=(now==0?po[0][a+1]:po[1][b+1]);
po2=(now==0?po[1][b]:po[0][a]);
fa=(now==0?1:0);
}
mn=mn+max(0,sum[lst][po1]-sum[lst][po0])+max(0,sum[fa][po1]-sum[fa][po2]);
dp[now][a+(now==0)][b+(now==1)][c+(now==2)]=min(dp[now][a+(now==0)][b+(now==1)][c+(now==2)],mn);
}
}
}
}
}
int ans=inf;
for(int i=0; i<3; i++) ans=min(ans,dp[i][te[0]][te[1]][te[2]]);
cout<<(ans==inf?-1:ans)<<endl;
return 0;
}
# | 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... |