Submission #1344711

#TimeUsernameProblemLanguageResultExecution timeMemory
1344711toast12Miners (IOI07_miners)C++20
100 / 100
920 ms444764 KiB
#include <bits/stdc++.h>
using namespace std;

int n;
vector<int> v;

int uniq(int a, int b, int c) {
    set<int> s;
    s.insert(a);
    s.insert(b);
    s.insert(c);
    if (*s.begin() == 0) return s.size()-1;
    return s.size();
}

vector<vector<vector<vector<vector<int>>>>> dp;

int solve(int i, int a, int b, int x, int y) {
    if (i == n) return 0;
    if (dp[i][a][b][x][y] != -1) return dp[i][a][b][x][y];
    int ans = 0;
    ans = max(ans, solve(i+1, b, v[i], x, y) + uniq(a, b, v[i]));
    ans = max(ans, solve(i+1, a, b, y, v[i]) + uniq(x, y, v[i]));
    return dp[i][a][b][x][y] = ans;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    string s;
    cin >> n >> s;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'M') v.push_back(1);
        else if (s[i] == 'F') v.push_back(2);
        else v.push_back(3);
    }
    dp.resize(n, vector<vector<vector<vector<int>>>>(4, vector<vector<vector<int>>>(4, vector<vector<int>>(4, vector<int>(4, -1)))));
    cout << solve(0, 0, 0, 0, 0) << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...