제출 #1165709

#제출 시각아이디문제언어결과실행 시간메모리
1165709AlgorithmWarriorGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
57 ms4276 KiB
#include <bits/stdc++.h>

using namespace std;

int const INF=1e9;
int const MAX=405;
int dp[MAX][MAX][3][2];
int v[MAX];
int poz[3][MAX];
int pref[MAX][3];
int n;
char trans[300];
int freq[3];
int delta[][2]={{-1,0},
              {0,-1},
              {0,0}};
int fr[3];

void read(){
    cin>>n;
    trans['R']=0;
    trans['G']=1;
    trans['Y']=2;
    int i,j;
    for(i=1;i<=n;++i){
        char ch;
        cin>>ch;
        v[i]=trans[(int)ch];
        poz[v[i]][++freq[v[i]]]=i;
        pref[i][v[i]]=1;
        for(j=0;j<3;++j)
            pref[i][j]+=pref[i-1][j];
    }
}

void minself(int& x,int val){
    if(x>val)
        x=val;
}

int get_dp(){
    int ult,i,penult;
    for(fr[0]=0;fr[0]<MAX;++fr[0])
        for(fr[1]=0;fr[1]<MAX;++fr[1])
            for(ult=0;ult<3;++ult)
                for(i=0;i<2;++i)
                    dp[fr[0]][fr[1]][ult][i]=INF;
    if(freq[0]) dp[1][0][0][1]=poz[0][1]-1;
    if(freq[1]) dp[0][1][1][1]=poz[1][1]-1;
    if(freq[2]) dp[0][0][2][1]=poz[2][1]-1;
    for(i=2;i<=n;++i)
        for(fr[0]=0;fr[0]<=freq[0];++fr[0])
            for(fr[1]=0;fr[1]<=freq[1];++fr[1])
                if(fr[0]+fr[1]<=i && i-fr[0]-fr[1]<=freq[2]){
                    fr[2]=i-fr[0]-fr[1];
                    for(ult=0;ult<3;++ult){
                        if(!fr[ult]) continue;
                        dp[fr[0]][fr[1]][ult][i&1]=INF;
                        int add=0;
                        int pos=poz[ult][fr[ult]];
                        for(penult=0;penult<3;++penult)
                            if(penult!=ult && fr[penult]<pref[pos][penult])
                                add+=pref[pos][penult]-fr[penult];
                        for(penult=0;penult<3;++penult)
                            if(penult!=ult)
                                minself(dp[fr[0]][fr[1]][ult][i&1],dp[fr[0]+delta[ult][0]][fr[1]+delta[ult][1]][penult][!(i&1)]+add);
                    }
                }
    int ans=INF;
    for(ult=0;ult<3;++ult)
        minself(ans,dp[freq[0]][freq[1]][ult][n&1]);
    return (ans<INF)?ans:-1;
}

int main()
{
    read();
    cout<<get_dp();
    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...