Submission #1197078

#TimeUsernameProblemLanguageResultExecution timeMemory
1197078aykhnGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
153 ms4500 KiB
#include <bits/stdc++.h>

using namespace std;

#define inf 0x3F3F3F3F

const int MXN = 4e2 + 5;

int dp[MXN][MXN][3];
int ndp[MXN][MXN][3];

void _()
{
  int n;
  cin >> n;
  int a[n + 1];
  vector<int> idx[3] = {{0}, {0}, {0}};
  vector<int> up[3][3];
  for (int i = 1; i <= n; i++)
  {
    char ch;
    cin >> ch;
    a[i] = (ch == 'R' ? 0 : ch == 'G' ? 1 : 2);
    idx[a[i]].push_back(i);
  }
  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      for (int &k : idx[i])
      {
        up[i][j].push_back(upper_bound(idx[j].begin(), idx[j].end(), k) - idx[j].begin());
      }
    }
  }
  for (int i = 0; i < MXN; i++) for (int j = 0; j < MXN; j++) for (int l = 0; l < 3; l++) dp[i][j][l] = inf;
  if (idx[0].size() > 1) dp[1][0][0] = idx[0][1] - 1;
  if (idx[1].size() > 1) dp[0][1][1] = idx[1][1] - 1;
  if (idx[2].size() > 1) dp[0][0][2] = idx[2][1] - 1;
  for (int all = 1; all < n; all++)
  {
    for (int i = 0; i < MXN; i++) for (int j = 0; j < MXN; j++) for (int l = 0; l < 3; l++) ndp[i][j][l] = inf;
    for (int a = 0; a < idx[0].size(); a++)
    {
      for (int b = 0; b < idx[1].size(); b++)
      {
        int c = all - a - b;
        if (c >= idx[2].size()) continue;
        for (int l = 0; l < 3; l++)
        {
          if (l != 0 && a + 1 < idx[0].size())
          {
            int val = max(0, up[0][1][a + 1] - b - 1) + max(0, up[0][2][a + 1] - c - 1);
            ndp[a + 1][b][0] = min(ndp[a + 1][b][0], dp[a][b][l] + val);
          }
          if (l != 1 && b + 1 < idx[1].size())
          {
            int val = max(0, up[1][0][b + 1] - a - 1) + max(0, up[1][2][b + 1] - c - 1);
            ndp[a][b + 1][1] = min(ndp[a][b + 1][1], dp[a][b][l] + val);
          }
          if (l != 2 && c + 1 < idx[2].size())
          {
            int val = max(0, up[2][0][c + 1] - a - 1) + max(0, up[2][1][c + 1] - b - 1);
            ndp[a][b][2] = min(ndp[a][b][2], dp[a][b][l] + val);
          }
        }
      }
    }
    for (int i = 0; i < MXN; i++) for (int j = 0; j < MXN; j++) for (int l = 0; l < 3; l++) dp[i][j][l] = ndp[i][j][l];
  }
  int res = *min_element(dp[(int)idx[0].size() - 1][(int)idx[1].size() - 1], dp[(int)idx[0].size() - 1][(int)idx[1].size() - 1] + 3);
  cout << (res >= inf ? -1 : res) << '\n';
}

signed main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int t = 1;
  // cin >> t;
  while (t--) _();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...