제출 #119987

#제출 시각아이디문제언어결과실행 시간메모리
119987tutisGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++17
75 / 100
1066 ms121920 KiB
/*input
5
RRGYY
*/
#pragma GCC optimize ("O3")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
unordered_map<bitset<1200>, int>M[3];
bitset<1200>xx[400];
int dp(bitset<1200>s, int x, int n)
{
	if (M[x].count(s))
		return M[x][s];
	if (n == 1)
	{
		for (int i = 0; i < 400; i++)
			if (s[400 * x + i])
				return M[x][s] = 0;
		return M[x][s] = 1e8 + 5;
	}
	int i = s._Find_next(x * 400 - 1) - 400 * x;
	if (i < 400)
	{
		int cost = (s & xx[i]).count() - 1;
		bitset<1200>ss = s;
		ss[x * 400 + i] = false;
		int mini = 3e8;
		for (int y = 0; y <= 2; y++)
		{
			if (x != y)
			{
				mini = min(mini, dp(ss, y, n - 1));
			}
		}
		return M[x][s] = cost + mini;
	}
	return M[x][s] = 3e8;
}
int code(char c)
{
	if (c == 'R')
		return 0;
	if (c == 'G')
		return 1;
	return 2;
}
int main()
{
	bitset<1200>aa;
	for (int i = 0; i < 400; i++)
	{
		aa[i] = aa[400 + i] = aa[800 + i] = true;
		xx[i] = aa;
	}
	ios_base::sync_with_stdio(false);
	int n;
	string s;
	cin >> n >> s;
	bitset<1200>ss;
	for (int i = 0; i < n; i++)
	{
		ss[400 * code(s[i]) + i] = true;
	}
	int ans = min({dp(ss, 0, n), dp(ss, 1, n), dp(ss, 2, n)});
	if (ans > 1e8)
		ans = -1;
	cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...