# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
120412 | Just_Solve_The_Problem | Growing Vegetable is Fun 3 (JOI19_ho_t3) | C++11 | 18 ms | 768 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define ok puts("OK");
using namespace std;
const int inf = (int)1e9 + 7;
const int N = (int)1500 + 7;
int dp[2][N][1 << 3][4];
int n;
string S;
int s[N];
main() {
memset(dp, 63, sizeof dp);
scanf("%d", &n);
cin >> S;
for (int i = 0; i < n; i++) {
int x;
if (S[i] == 'R') x = 0;
if (S[i] == 'G') x = 1;
if (S[i] == 'Y') x = 2;
s[i + 1] = x;
}
dp[0][1][0][3] = 0;
for (int i = 0; i < n; i++) {
int nxt = (i & 1 ^ 1);
memset(dp[nxt], 63, sizeof dp[nxt]);
for (int j = 1; j <= n; j++) {
for (int mask = 0; mask < 8; mask++) {
for (int last = 0; last < 4; last++) {
int res = dp[i & 1][j][mask][last];
dp[nxt][j + 1][mask | (1 << s[i + 1])][last] = min(dp[nxt][j + 1][mask | (1 << s[i + 1])][last], res);
if ((mask >> s[i + 1]) & 1) continue;
if (last != s[i + 1]) {
dp[nxt][j][mask][s[i + 1]] = min(dp[nxt][j][mask][s[i + 1]], res + j);
}
if (j > 1) {
dp[nxt][j - 1][mask][s[i + 1]] = min(dp[nxt][j - 1][mask][s[i + 1]], res + j - 1);
} else {
dp[nxt][j][1 << s[i + 1]][s[i + 1]] = min(dp[nxt][j][1 << s[i + 1]][s[i + 1]], res);
}
}
}
}
}
int ans = 1e9 + 2;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 4; j++)
ans = min(ans, dp[n & 1][1][i][j]);
if (ans > 1e9)
ans = -1;
cout << ans;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |