제출 #1246083

#제출 시각아이디문제언어결과실행 시간메모리
1246083nasjesGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
0 / 100
0 ms324 KiB
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
using namespace std;
typedef int ll;
typedef pair<ll, ll> pll;
typedef long double ld;
const ll dim = 1e3+7;
//const ll mod = 1e9 + 7;
const ll inf = 1e7 + 77;
#define endl "\n"
#define fi first
#define pb push_back
#define se second
#define vll vector<ll>

ll n, m;
ll pos[5][dim];
ll a[dim];
ll pr[5][dim];
ll dp[5][450][450][3];
int main() {
    ll k, t, u0, v0;
    string s;
    cin>>n;
    cin>>s;
    ll cnt1=0;
    ll cnt2=0;
    ll cnt3=0;
    for(int i=1; i<=n; i++){
        if(s[i-1]=='R'){cnt1++;pos[1][cnt1]=i; a[i]=1;}
        else if(s[i-1]=='G'){cnt2++;pos[2][cnt2]=i; a[i]=2;}
        else {cnt3++; pos[3][cnt3]=i; a[i]=3;}
    }

    for(int last=1; last<=3; last++) {
        for (int r = 0; r <=cnt1; r++) {
            for (int j = 0; j <=  cnt2; j++) {
                dp[last][r][j][0]=inf;
                dp[last][r][j][1]=inf;
            }
        }
    }
    dp[1][0][0][0]=0;
    dp[2][0][0][0]=0;
    dp[3][0][0][0]=0;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=3; j++){
            pr[j][i]=pr[j][i-1];
        }
        pr[a[i]][i]++;
    }
    ll ans=inf;
    for(int i=0; i<=n; i++){
        for(int last=1; last<=3; last++) {
            for (int r = 0; r <= min<ll>(i, cnt1); r++) {
                for (int j = 0; j <= min<ll>(i-r, cnt2); j++) {
                    ll y = i- (r + j);
                    if(y<0)continue;
                    ll op1=inf, op2=inf, op3=inf;
                    if(r!=cnt1){
                        ll cur=pos[1][r+1];
                        ll tmp23=max<ll>(0, pr[2][cur]-j)+max<ll>(0, pr[3][cur]-y);
                        op1=tmp23;
                    }
                    if(j!=cnt2){
                        ll cur=pos[2][j+1];
                        ll tmp13=max<ll>(0, pr[1][cur]-r)+max<ll>(0, pr[3][cur]-y);
                        op2=tmp13;
                    }
                    if(y!=cnt3){
                        ll cur=pos[3][y+1];
                        ll tmp12=max<ll>(0, pr[1][cur]-r)+max<ll>(0, pr[2][cur]-j);
                        op3=tmp12;
                    }
                    if(last==1){
                        if(j!=cnt2)dp[2][r][j+1][1]=min(dp[last][r][j][0]+op2, dp[2][r][j+1][1]);
                        if(y!=cnt3)dp[3][r][j][1]=min(dp[last][r][j][0]+op3, dp[3][r][j][1]);

                    }
                    if(last==2){
                        if(r!=cnt1)dp[1][r+1][j][1]=min(dp[last][r][j][0]+op1, dp[1][r+1][j][1]);
                        if(y!=cnt2)dp[3][r][j][1]=min(dp[last][r][j][0]+op3, dp[3][r][j][1]);

                    }
                    if(last==3){

                        if(j!=cnt2)dp[2][r][j+1][1]=min(dp[last][r][j][0]+op2, dp[2][r][j+1][1]);
                        if(r!=cnt1)dp[1][r+1][j][1]=min(dp[last][r][j][0]+op1, dp[1][r+1][j][1]);

                    }

                }

            }
        }
        for(int last=1; last<=3; last++) {
            for (int r = 0; r <= min<ll>(i, cnt1); r++) {
                for (int j = 0; j <= min<ll>(i - cnt1, cnt2); j++) {
                    ll y = i - (r + j);
                    if(y<0)continue;
                    //cout<<dp[last][r][j][1]<<" -- "<<r<<" --  "<<j<<endl;
                    dp[last][r][j][0]=dp[last][r][j][1];
                    dp[last][r][j][1]=inf;
                }
            }
        }
        //cout<<endl<<i<<endl<<endl;

    }
    cout<<ans<<endl;



    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...