Submission #167403

# Submission time Handle Problem Language Result Execution time Memory
167403 2019-12-08T08:25:33 Z Nightlight Miners (IOI07_miners) C++14
100 / 100
133 ms 1016 KB
#include <bits/stdc++.h>
using namespace std;

int N;
int A[100005];
int DP[2][4][4][4][4]; // DP(n, 2nd last mine 1, last mine 1, 2nd last mine 2, last mine 2)

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    cin >> N;
    string S;
    cin >> S;

    for (int i = 0; i < N; i++) {
        if (S[i] == 'M') {
            A[i] = 1;
        } else if (S[i] == 'B') {
            A[i] = 2;
        } else {
            A[i] = 3;
        }
    }

    for (int n = N - 1; n >= 0; n--) {
        for (int s1 = 0; s1 < 4; s1++) {
            for (int l1 = 0; l1 < 4; l1++) {
                for (int s2 = 0; s2 < 4; s2++) {
                    for (int l2 = 0; l2 < 4; l2++) {
                        int& res = DP[n % 2][s1][l1][s2][l2];
                        res = 0;
                        int ss1 = s1, ll1 = l1, ss2 = s2, ll2 = l2;
                        if (s1 == 0) {
                            ss1 = A[n];
                        }
                        if (s2 == 0) {
                            ss2 = A[n];
                        }
                        if (l1 == 0) {
                            ll1 = A[n];
                        }
                        if (l2 == 0) {
                            ll2 = A[n];
                        }

                        if (ss1 == A[n] && ll1 == A[n]) {
                            res = max(res, 1 + DP[(n + 1) % 2][l1][A[n]][s2][l2]);
                        } else if (ss1 == A[n] || ll1 == A[n] || ss1 == ll1) {
                            res = max(res, 2 + DP[(n + 1) % 2][l1][A[n]][s2][l2]);
                        } else {
                            res = max(res, 3 + DP[(n + 1) % 2][l1][A[n]][s2][l2]);
                        }

                        if (ss2 == A[n] && ll2 == A[n]) {
                            res = max(res, 1 + DP[(n + 1) % 2][s1][l1][l2][A[n]]);
                        } else if (ss2 == A[n] || ll2 == A[n] || ss2 == ll2) {
                            res = max(res, 2 + DP[(n + 1) % 2][s1][l1][l2][A[n]]);
                        } else {
                            res = max(res, 3 + DP[(n + 1) % 2][s1][l1][l2][A[n]]);
                        }
                    }
                }
            }
        }
    }

    cout << DP[0][0][0][0][0] << "\n";

    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 380 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 50 ms 572 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 99 ms 912 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 133 ms 1016 KB Output is correct