제출 #1197073

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

using namespace std;

#define int long long
#define inf 0x3F3F3F3F3F3F3F3F

const int MXN = 4e2 + 5;

int dp[MXN][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 k = 0; k < MXN; k++) for (int l = 0; l < 3; l++) dp[i][j][k][l] = inf;
  if (idx[0].size() > 1) dp[1][0][0][0] = idx[0][1] - 1;
  if (idx[1].size() > 1) dp[0][1][0][1] = idx[1][1] - 1;
  if (idx[2].size() > 1) dp[0][0][1][2] = idx[2][1] - 1;
  for (int all = 1; all < n; all++)
  {
    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(0LL, up[0][1][a + 1] - b - 1) + max(0LL, up[0][2][a + 1] - c - 1);
            dp[a + 1][b][c][0] = min(dp[a + 1][b][c][0], dp[a][b][c][l] + val);
          }
          if (l != 1 && b + 1 < idx[1].size())
          {
            int val = max(0LL, up[1][0][b + 1] - a - 1) + max(0LL, up[1][2][b + 1] - c - 1);
            dp[a][b + 1][c][1] = min(dp[a][b + 1][c][1], dp[a][b][c][l] + val);
          }
          if (l != 2 && c + 1 < idx[2].size())
          {
            int val = max(0LL, up[2][0][c + 1] - a - 1) + max(0LL, up[2][1][c + 1] - b - 1);
            dp[a][b][c + 1][2] = min(dp[a][b][c + 1][2], dp[a][b][c][l] + val);
          }
        }
      }
    }
  }
  int res = *min_element(dp[(int)idx[0].size() - 1][(int)idx[1].size() - 1][(int)idx[2].size() - 1], dp[(int)idx[0].size() - 1][(int)idx[1].size() - 1][(int)idx[2].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...