Cod sursa(job #2452953)

Utilizator IonAdrianIon Adrian IonAdrian Data 1 septembrie 2019 20:38:53
Problema Stergeri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;

void _ (int &x, int y) {if (x < y) x = y;}
const int N = 600;
int dp[1 + N * 4][1 + N * 4], a[1 + N * 4];
int main() {
    freopen ("harrypotter.in", "r", stdin);
    freopen ("harrypotter.out", "w", stdout);
    int n;
    cin >> n;
    vector <vector <int> > pos (n + 1);
    n *= 4;
    for (int i = 1; i <= n; i++) cin >> a[i], pos[a[i]].push_back (i);
    int ans = 0;
    for (int l = 1; l <= n; l++) for (int i = 1; i <= n; i++) {
        int j = i + l;
        if (j > n) continue;
        _ (dp[i][j], dp[i + 1][j]); _ (dp[i][j], dp[i][j - 1]);
        _ (dp[i][j], dp[i + 1][j - 1] + (a[i] == a[j]));
        for (int p : pos[a[i]]) if (i < p && p < j) _ (dp[i][j], dp[i + 1][p - 1] + dp[p + 1][j] + 1);
        for (int p : pos[a[j]]) if (i < p && p < j) _ (dp[i][j], dp[i][p - 1] + dp[p + 1][j - 1] + 1);
        _ (ans, dp[i][j]);
    }
    cout << ans << "\n";
    return 0;
}