Submission #1135531

#TimeUsernameProblemLanguageResultExecution timeMemory
1135531Hamed_GhaffariGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
68 ms31048 KiB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,sse4,sse4.2,lzcnt,popcnt")

using vi = vector<int>;
using vii = vector<vi>;
using viii = vector<vii>;

#define pb push_back
#define mins(a,b) (a = min(a,b))

const int MXN = 401;
const int INF = 1e9;

int n;
string s;
int ps[3][MXN];
viii dp[3];
vi pos[3];

int32_t main() {
  cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
  cin >> n >> s;
  pos[0].pb(-1); pos[1].pb(-1); pos[2].pb(-1);
  for(int i=0; i<n; i++) {
    if(i) for(int j : {0,1,2}) ps[j][i] = ps[j][i-1];
    ps[(s[i]=='R' ? 0 : (s[i]=='G' ? 1 : 2))][i]++;
    pos[(s[i]=='R' ? 0 : (s[i]=='G' ? 1 : 2))].pb(i);
  }
  for(int i : {0,1,2})
    dp[i] = viii(ps[0][n-1]+1, vii(ps[1][n-1]+1, vi(ps[2][n-1]+1, INF)));
  dp[0][0][0][0] = 0;
  int arr[3], arr2[3];
  for(arr[0]=0; arr[0]<=ps[0][n-1]; arr[0]++)
    for(arr[1]=0; arr[1]<=ps[1][n-1]; arr[1]++)
      for(arr[2]=0; arr[2]<=ps[2][n-1] && arr[0]+arr[1]+arr[2]<n; arr[2]++)
        for(int lst=0; lst<3; lst++)
          if(arr[0]+arr[1]+arr[2]==0 || arr[lst])
            for(int cur=0; cur<3; cur++)
              if((arr[0]+arr[1]+arr[2]==0 || lst!=cur) && arr[cur]<ps[cur][n-1]) {
                arr2[0] = arr[0];
                arr2[1] = arr[1];
                arr2[2] = arr[2];
                arr2[cur]++;
                mins(dp[cur][arr2[0]][arr2[1]][arr2[2]], 
                dp[lst][arr[0]][arr[1]][arr[2]]
                + max(0, arr2[0]-ps[0][pos[cur][arr2[cur]]])
                + max(0, arr2[1]-ps[1][pos[cur][arr2[cur]]])
                + max(0, arr2[2]-ps[2][pos[cur][arr2[cur]]]));
              }
  int res=INF;
  for(int lst=0; lst<3; lst++)
    mins(res, dp[lst][ps[0][n-1]][ps[1][n-1]][ps[2][n-1]]);
  cout << (res==INF ? -1 : res) << '\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...