1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <bits/stdc++.h> #define rep(i, s, e) for(int i = s; i <= e; ++i) using namespace std;
int n, a[7005], dp[2][7005][3], ans; char s[7005];
int solve() { scanf("%s", s + 1); n = strlen(s + 1); rep(i, 1, n) { a[i] = s[i] - 'A'; } rep(i, 0, 1) { rep(j, 1, n + 2) { rep(y, 0, 2) { dp[i][j][y] = 0x3f3f3f3f; } } } ans = 0; rep(i, 1, n) { rep(j, 1, i) { rep(y, 0, 2) { dp[i & 1][j][y] = 0x3f3f3f3f; int x = a[i], &f = dp[i & 1][j][y]; if(x == y) { continue; } int z = 3 - x - y; if(a[i - 1] == x) { f = min(f, dp[(i & 1) ^ 1][j][y] + 1); } else if(a[i - 1] == y) { if(j > 1) f = min(f, dp[(i & 1) ^ 1][j - 1][z] + 2); f = min(f, dp[(i & 1) ^ 1][j + 2][z] + 3); } else if(a[i - 1] == z) { f = min(f, dp[(i & 1) ^ 1][j + 1][x] + 2); if(j > 2) f = min(f, dp[(i & 1) ^ 1][j - 2][x] + 3); } } } int x = a[i], y = not a[i], z = 3 - x - y; dp[i & 1][1][y] = dp[i & 1][1][z] = min({dp[i & 1][1][y], dp[i & 1][1][z], ans + 2}); ans = 0x3f3f3f3f; rep(j, 1, i) { rep(y, 0, 2) { ans = min(ans, dp[i & 1][j][y] + j); } } } return ans; }
int main() { int T = 1; scanf("%d", &T); rep(i, 1, T) { printf("Case #%d: %d\n", i, solve()); } return 0; }
|