Pagini recente » Cod sursa (job #3030190) | Cod sursa (job #692064) | Cod sursa (job #2928979) | Cod sursa (job #1435467) | Cod sursa (job #2776834)
#include <iostream>
#include <fstream>
#define MOD 9901
int n;
int a[1000];
int prev[1000];
int c[1024][1024];
void getprev(int map) {
int iprev[500] = { 0 };
for (int i = 1; i <= map; ++i) {
prev[i] = iprev[a[i]];
iprev[a[i]] = i;
}
}
int main()
{
std::ifstream in("culori.in");
std::ofstream out("culori.out");
in >> n;
int map = 2 * n - 1;
for (int i = 1; i <= map; ++i) in >> a[i];
getprev(map);
for (int len = 1; len <= map; len += 2) {
for (int first = 1; first + len - 1 <= map; ++first) {
int last = first + len - 1;
if (len == 1) { c[first][last] = 1; continue; }
if (a[first] != a[last]) { c[first][last] = 0; continue; }
c[first][last] = c[first + 1][last - 1]; // No intermediates.
for (int second = prev[last]; second > first; second = prev[second]) {
c[first][last] += c[first][second] * c[second + 1][last - 1];
c[first][last] %= MOD;
}
//std::cerr << "c[" << first << "][" << last << "] = " << c[first][last]
// << std::endl;
}
}
out << c[1][map] << std::endl;
return 0;
}