제출 #1156967

#제출 시각아이디문제언어결과실행 시간메모리
1156967dnnndaGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
15 / 100
24 ms4168 KiB
#include<bits/stdc++.h>
using namespace std;
#define S second
#define F first
#define ll long long
//#define int long long
//#pragma GCC optimize("Ofast, unroll-loop")
//#pragma GCC target("avx,avx2")
#pragma GCC optimize("O3")
const int inf=0x3f3f3f3f;
const ll inff=0x3f3f3f3f3f3f3f3f;
//const int X=1000000007;
const int X=998244353;

int col[405], pre[3][405], last[405][405][3], dp[405][405][3];
vector<int> v[3];

int cal(array<int,4> arr){
    int ret=0, pos=v[arr[3]][arr[arr[3]]-1];
    //cout << pos << '\n';
    for(int i=0 ; i<3 ; i++){
        ret+=max(pre[i][pos]-arr[i],0);
        //cout << ret << '\n';
    }
    //cout << arr[0] << ' ' << arr[1] << ' ' << arr[2] << ' ' << arr[3] << " = " << ret << '\n';
    //return ret+pos-(arr[0]+arr[1]+arr[2]);
    return ret;
}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0);
    memset(pre,0,sizeof pre);
    memset(last,0x3f,sizeof last);
    memset(dp,0x3f,sizeof dp);
    int n; cin >> n;
    for(int i=1 ; i<=n ; i++){
        char c; cin >> c;
        if(c=='R') col[i]=0;
        if(c=='G') col[i]=1;
        if(c=='Y') col[i]=2;
        v[col[i]].push_back(i);
        pre[col[i]][i]++;
    }
    for(int i=1 ; i<=n ; i++){
        for(int j=0 ; j<3 ; j++) pre[j][i]+=pre[j][i-1];
    }
    //for(int i=1 ; i<=n ; i++) for(int j=0 ; j<3 ; j++) cout << j << ' ' << i << ' ' << pre[j][i] << '\n';
    last[0][0][0]=last[0][0][1]=last[0][0][2]=0;
    for(int r=1 ; r<=n ; r++){
        for(int i=0 ; i<=r ; i++) for(int j=0 ; i+j<=r ; j++){
            int k=r-i-j;
            for(int u=0 ; u<3 ; u++) dp[i][j][u]=inf;
            if(i>v[0].size()||j>v[1].size()||k>v[2].size()) continue;
            if(i>0) dp[i][j][0]=min(last[i-1][j][1],last[i-1][j][2])+cal({i,j,k,0});
            if(j>0) dp[i][j][1]=min(last[i][j-1][0],last[i][j-1][2])+cal({i,j,k,1});
            if(k>0) dp[i][j][2]=min(last[i][j][0],last[i][j][1])+cal({i,j,k,2});
            //for(int u=0 ; u<3 ; u++) cout << i << ' ' << j << ' ' << k << ' ' << u << " = " << dp[i][j][u] << '\n';
        }
        for(int i=0 ; i<=r ; i++) for(int j=0 ; i+j<=r ; j++){
            swap(last[i][j][0],dp[i][j][0]);
            swap(last[i][j][1],dp[i][j][1]);
            swap(last[i][j][2],dp[i][j][2]);
        }
    }
    int i=v[0].size(), j=v[1].size();
    if(min({last[i][j][0],last[i][j][1],last[i][j][2]})==inf) cout << "-1\n";
    else cout << min({last[i][j][0],last[i][j][1],last[i][j][2]}) << '\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...