Cod sursa(job #2698703)

Utilizator CiubarLoverBaiatu cu Ciubaru CiubarLover Data 22 ianuarie 2021 20:33:10
Problema Culori Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#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;
}