제출 #1284454

#제출 시각아이디문제언어결과실행 시간메모리
1284454Jawad_Akbar_JJGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
341 ms4248 KiB
#include <iostream>

using namespace std;
const int N = 405;
int R[2][N][N], B[2][N][N], G[2][N][N];

signed main(){
	int n;
	string s;
	cin>>n>>s;
	s = '0' + s;

	for (int i : {0, 1}){
		for (int j=0;j<=n;j++)
			for (int k=0;k<=n;k++)
				if (i + j + k > 0)
					R[i][j][k] = G[i][j][k] = B[i][j][k] = 1e9;
	}

	for (int i=1;i<=n;i++){
		for (int j=0;j<=n;j++){
			if (s[i] == 'Y'){
				B[1][0][j] = min(B[1][0][j], R[0][j][0] + j);
				B[1][j][0] = min(B[1][j][0], G[0][j][0] + j);

				B[1][0][j+1] = min(B[1][0][j+1], R[0][j][0] + j + 1);
				B[1][j+1][0] = min(B[1][j+1][0], G[0][j][0] + j + 1);
			}

			if (s[i] == 'G'){
				G[1][0][j] = min(G[1][0][j], R[0][0][j] + j);
				G[1][j][0] = min(G[1][j][0], B[0][j][0] + j);

				G[1][0][j+1] = min(G[1][0][j+1], R[0][0][j] + j + 1);
				G[1][j+1][0] = min(G[1][j+1][0], B[0][j][0] + j + 1);
			}

			if (s[i] == 'R'){
				R[1][0][j] = min(R[1][0][j], G[0][0][j] + j);
				R[1][j][0] = min(R[1][j][0], B[0][0][j] + j);

				R[1][0][j+1] = min(R[1][0][j+1], G[0][0][j] + j + 1);
				R[1][j+1][0] = min(R[1][j+1][0], B[0][0][j] + j + 1);
			}
			for (int k=0;k<=n;k++){
				int vl = j + k + 1;

				if (s[i] == 'Y'){
					if (k > 0 and R[0][j][k] < R[1][j][k-1])
						R[1][j][k-1] = R[0][j][k];
					if (k > 0 and G[0][j][k] < G[1][j][k-1])
						G[1][j][k-1] = G[0][j][k];

					if (B[0][j][k] + j + k + 1 < B[1][j+1][k])
						B[1][j+1][k] = B[0][j][k] + vl;
					if (B[0][j][k] + j + k + 1 < B[1][j][k+1])
						B[1][j][k+1] = B[0][j][k] + vl;
				}

				if (s[i] == 'G'){
					if (j > 0 and R[0][j][k] < R[1][j-1][k])
						R[1][j-1][k] = R[0][j][k];
					if (k > 0 and B[0][j][k] < B[1][j][k-1])
						B[1][j][k-1] = B[0][j][k];

					if (G[0][j][k] + j + k + 1 < G[1][j+1][k])
						G[1][j+1][k] = G[0][j][k] + vl;
					if (G[0][j][k] + j + k + 1 < G[1][j][k+1])
						G[1][j][k+1] = G[0][j][k] + vl;
				}

				if (s[i] == 'R'){
					if (j > 0 and B[0][j][k] < B[1][j-1][k])
						B[1][j-1][k] = B[0][j][k];
					if (j > 0 and G[0][j][k] < G[1][j-1][k])
						G[1][j-1][k] = G[0][j][k];

					if (R[0][j][k] + j + k + 1 < R[1][j+1][k])
						R[1][j+1][k] = R[0][j][k] + vl;
					if (R[0][j][k] + j + k + 1 < R[1][j][k+1])
						R[1][j][k+1] = R[0][j][k] + vl;
				}
			}
		}

		for (int j=0;j<=n;j++){
			for (int k=0;k<=n;k++){
				R[0][j][k] = R[1][j][k];
				G[0][j][k] = G[1][j][k];
				B[0][j][k] = B[1][j][k];

				G[1][j][k] = R[1][j][k] = B[1][j][k] = 1e9;
			}
		}
	}

	int Mn = min(R[0][0][0], min(G[0][0][0], B[0][0][0]));

	if (Mn == 1e9)
		Mn = -1;
	cout<<Mn<<'\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...