Pagini recente » Cod sursa (job #3145727) | Cod sursa (job #2951096) | Cod sursa (job #2916490) | Cod sursa (job #1025903) | Cod sursa (job #2717291)
#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';
}