Pagini recente » Cod sursa (job #3229573) | Cod sursa (job #1066254) | Cod sursa (job #447402) | Cod sursa (job #119512) | Cod sursa (job #2698703)
#include <bits/stdc++.h>
#define rest 9901
using namespace std;
ifstream fin("culori.in");
ofstream fout("culori.out");
int n;///numarul de noduri in arbore
int elem[520];///culorile citite
int dp[520][520];///dp[i][j] cate modalitati sunt pentru crearea arborelului format doar din elementele de la i la j
int main()
{
///Prin liniarizarea unui arbore cu n noduri se obtine un sir cu 2*n-1 valori
fin>>n;
for(int i=1;i<=2*n-1;i++)
{
fin>>elem[i];
dp[i][i]=1;///arborele cu un singur nod
}
/// Se va folosii programarea dinamica pentru rezolvarea problemei.
/// Ca sa ajungem la nr. total de modalitati trebuie sa obtinem prima data
/// nr. de modalitati de a forma arborii mai mici.
for(int dist=2;dist<2*n-1;dist+=2)///dist+1=numarul de valori luate din sirul citit
for(int st=1;st<=2*n-1-dist;st++)///'st' marcheaza radacina
if(elem[st]==elem[st+dist])///elem[st]=elem[st+dist]=culoarea radacinei
for(int leg=st+1;leg<=st+dist-1;leg+=2)
///st->st+dist aceeasi culoare
///Daca avem st+1->leg si leg+1->st+dist de aceeasi culoare, nr. de modalitati o sa creasca
///st+1->leg poate fi privit ca si un arbore al unui copil al lui st
///leg+1->st+dist poate fi privit ca si arborele cu radacina in st fara copilul cu arborele st+1->leg
dp[st][st+dist]=(dp[st][st+dist]+dp[st+1][leg]*dp[leg+1][st+dist])%rest;
fout<<dp[1][2*n-1];///numarul total de modalitati luand toate elementele sirului
return 0;
}