Problema kperms, Campion 2009
.campion, algoritmica, informatica, kperms, OJI, ONI, Probleme algoritmica
De curând Gigel a devenit atras de permutări, în special de acele permutări cu N elemente ce conţin exact K secvenţe descrescătoare maximale.
Cerinţă
Scrieţi un program care să determine câte permutări de N elemente cu exact K secvenţe descrescătoare maximale există?
Date de intrare
Fişierul de intrare kperms.in va conţine o singură linie pe care se afla numerele naturale N şi K separate printr-un spaţiu.
Date de ieşire
Fişierul de ieşire kperms.out va conţine o singură linie pe care va fi scris numărul de permutări de N elemente cu exact K secvenţe descrescătoare maximale modulo 666013.
Restricţii
- 2 ≤ N ≤ 1000
- 1 ≤ K ≤ N
- Prin secventa se intelege o succesiune de de elemente situate pe pozitii consecutive. O secvenţă descrescătoare este considerată maximală dacă nu mai poate fi adăugat în secvenţă un element (evident, la unul dintre capetele secvenţei) astfel încât secvenţa să rămână descrescătoare.
Exemple
| kperms.in | kperms.out | Explicatie |
| 4 2 | 11 | Cele 11 permutari sunt: 1 4 3 2 2 1 4 3 2 4 3 1 3 1 4 2 4 2 3 1 |
Solutie
Aceasta problema are nevoie de o tehnica ce se bazeaza pe programare dinamica. Vom considera
Vom considera :
d[i][j] = cate permutari de i elemente cu j secvente descrescatoare maximale
Presupunem ca avem o permutare cu i-1 elemente si cu j secvente descrescatoare maximale. Observam ca putem insera elementul i intre i pozitii (la inceput, la sfarsit, sau intre oricare 2 elemente consecutive).
Daca introducem pe i inaintea uneia dintre cele j secvente numarul de secvente descrescatoare va ramane la fel
iar daca inseram in celelalte i – j + 1 pozitii numarul de secvente descrescatoare creste cu 1.
Recurenta va ajunge astfel:
d[1][1] =1 d[i][j] = (i – j + 1) * d[i – 1] [j – 1] + j * d[i – 1][ j ]
Rezolvarile mele difera putin, eu am folosit doua abordari mai “ciudate”, ca de obicei. In ambele situatii m-am folosit de faptul ca datorita recurentei dezvoltate mai sus, vom avea nevoie de doar de ultimile doua linii din matrice.
In primul caz am folosit doi pointeri cu care am jonglat pentru a schimba intre ele liniile, prima devenind ultima si invers.Solutia o puteti descarca de aici.
Cea de-a doua situatie se bazeaza pe acelasi lucru, doar ca am folosit doar un singur vector si doua variabile care schimba pozitiile indicilor si muta locatiile la inceputul vectorului sau la pozitia n+ceva .Solutia a doua o puteti descarca aici.





Nou pe 


Comentarii la "Problema kperms, Campion 2009"
Pff… mi-e dor de campion… câte nopți nedormite și câte petreceri neonorate din cauza campionului (îmi plăcea mai mult să stau cu „echipa” de matefizinformaticieni decât să-i fi văzut pe alții cum dau la rațe și la colțu blocului)
Da e frumos. De ce nu mai lucrezi? Cine te opreste?Nu e neaparat nevoie sa intri la finala ci doar sa te “incalzesti”.Mai este algoritmiada pe infoarena care este si pentru studenti.
[...] This post was mentioned on Twitter by Avadanei Andrei and Avadanei Andrei, Andrei Avadanei. Andrei Avadanei said: Problema kperms, Campion 2009 http://bit.ly/dvtg5G #WorldIT [...]