Cod sursa(job #2717291)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 6 martie 2021 23:30:20
Problema Culori Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("culori.in");
ofstream fout("culori.out");

const int NMAX = 520;
const int mod = 9901;
int N, a[NMAX], dp[NMAX][NMAX];

void add_self(int &a, int b) {
    a += b;
    if(a >= mod)
        a -= mod;
}

int main() {
    fin >> N;
    N = 2 * N - 1;
    for(int i = 1; i <= N; ++i) {
        fin >> a[i];
        dp[i][i] = 1; /// un arbore format dintr-un nod e ok
    }
    for(int lg = 2; lg <= N; ++lg)
        for(int i = 1; i + lg - 1 <= N; ++i) {
            int j = i + lg - 1;
            if(a[i] == a[j] && !((i + j) & 1)) /// egalitate pentru a satisface conditia parcurgerii Euler
                /// suma para pentru a avea i si j aceeasi paritate, adica secventa i...j lungime impara(parcurgerea Euler are lungime impara)
                for(int k = i + 1; k < j; ++k) /// fixam primul subarbore(i + 1...k)
                    if(a[i + 1] == a[k]) /// pentru subarborele fixat conditia de la parcurgerea Euler trebuie satisfacuta
                        add_self(dp[i][j], dp[i + 1][k] * dp[k + 1][j] % mod);
        }
    fout << dp[1][N] << '\n';
}