Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pa:laboratoare:backup-lab02 [2018/02/21 01:32] (current)
darius.neatu created
Line 1: Line 1:
 +====== Laborator 02 : Greedy======
 +
 +TODO: scos DP
 +===== Obiective laborator =====
 +  *Înțelegerea noțiunilor de bază legate de tehnica greedy
 +  *Însușirea abilităților de analiză în vederea conceperii algoritmilor de tip greedy pentru rezolvarea diferitelor probleme;
 +  *Însușirea abilităților de implementare a algoritmilor bazați pe greedy
 +
 +===== Importanță – aplicații practice =====
 +În general tehnicile de tip Greedy sau Programare Dinamică (lab04) sunt folosite pentru rezolvarea problemelor de optimizare. Acestea pot adresa probleme în sine sau pot fi subprobleme dintr-un algoritm mai mare. De exemplu, algoritmul Dijkstra pentru determinarea drumului minim pe un graf alege la fiecare pas un nod nou urmărind algoritmul greedy.
 +
 +Exista însă probleme care ne pot induce în eroare. Astfel, există probleme în care urmărind criteriul Greedy nu ajungem la soluția optimă. Este foarte important să identificăm cazurile când se poate aplica Greedy și cazurile când este nevoie de altceva. Alteori această soluție neoptimă este o aproximare suficientă pentru ce avem nevoie. Problemele NP-complete necesita multă putere de calcul pentru a găsi optimul absolut. Pentru a optimiza aceste calcule mulți algoritmi folosesc decizii Greedy și găsesc un optim foarte aproape de cel absolut.
 +
 +===== Prezentarea generală a problemei =====
 +
 +===== Greedy =====
 +
 +“greedy” = “lacom”. Algoritmii de tip greedy vor să construiască într-un mod cât mai rapid soluția unei probleme. Ei se caracterizează prin luarea unor decizii rapide care duc la găsirea unei soluții potențiale a problemei. Nu întotdeauna asemenea decizii rapide duc la o soluție optimă; astfel ne vom concentra atenția pe identificarea acelor anumite tipuri de probleme pentru care se pot obține soluții optime.
 +
 +Algoritmii greedy se numără printre cei mai direcți algoritmi posibili. Ideea de bază este simplă: având o problema de optimizare, de calcul al unui cost minim sau maxim, se va alege la fiecare pas decizia cea mai favorabilă,​ fără a evalua global eficiența soluţiei. În general exista mai multe soluții posibile ale problemei. Dintre acestea se pot selecta doar anumite soluții optime, conform unor anumite criterii. Scopul este de a găsi una dintre acestea sau dacă nu este posibil, atunci o soluție cât mai apropiată, conform criteriului optimal impus.
 +
 +Trebuie înțeles faptul ca rezultatul obținut este optim doar dacă un optim local conduce la un optim global. În cazul în care deciziile de la un pas influențează lista de decizii de la pasul următor, este posibila obținerea unei valori neoptimale. În astfel de cazuri, pentru găsirea unui optim absolut se ajunge la soluții supra-polinomiale. De aceea, dacă se optează pentru o astfel de soluție, algoritmul trebuie însoțit de o demonstrație de corectitudine.
 +Descrierea formală a unui algoritm greedy este următoarea:​
 +
 +<code cpp>
 +function greedy(C)
 +// C este mulțimea candidaților
 +// în S construim soluția
 +S ← Ø
 +while not solutie(C) and C≠Ø
 +x ← un element din C care minimizează/​maximizează select(x)
 +C ← C\{x}
 +if fezabil(S∪{x}) then S←S∪{x}
 +return S
 +</​code>​
 +
 +Este ușor de înțeles acum de ce acest algoritm se numește ”greedy”:​ la fiecare pas se alege cel mai bun candidat de la momentul respectiv, fără a studia alternativele disponibile în moment respectiv şi viabilitatea acestora în timp.
 +
 +Dacă un candidat este inclus în soluție, rămâne acolo, fără a putea fi modificat, iar dacă este exclus din soluție, nu va mai putea fi niciodată selectat drept un potențial candidat.
 +
 +===== Exemplu de problema rezolvabilă cu tehnica Greedy =====
 +
 +Fie un șir de N numere pentru care se cere determinarea unui subșir de numere cu suma maximă. Un subșir al unui șir este format din caractere (nu neapărat consecutive) ale șirului respectiv, în ordinea în care acestea apar în șir.
 +
 +Pentru numerele 1 -5 6 2 -2 4 răspunsul este 1 6 2 4 (suma 13).
 +
 +Se observa ca tot ce avem de făcut este sa verificam fiecare număr dacă este pozitiv sau nu. În cazul pozitiv, îl introducem în subșirul soluție.
 +
 +
 +===== Problema spectacolelor =====
 +
 +Se dau mai multe spectacole, prin timpii de start și timpii de final. Se cere o planificare astfel încât o persoană să poată vedea cât mai multe spectacole. Rezolvarea constă în sortarea spectacolelor crescător după timpii de final, apoi la fiecare pas se alege primul spectacol care are timpul de start mai mare decât ultimul timp de final. Timpul inițial de final este inițializat la -infinit (spectacolul care se termină cel mai devreme va fi mereu selectat, având timp de start mai mare decât timpul inițial). ​
 +
 +
 +===== Problema cuielor =====
 +
 +Fie N scânduri de lemn, descrise ca niște intervale închise cu capete reale. Găsiți o mulțime minimă de cuie astfel încât fiecare scândură să fie bătută de cel puțin un cui. Se cere poziția cuielor. Formulat matematic: găsiți o mulțime de puncte de cardinal minim M astfel încât pentru orice interval [a<​sub>​i</​sub>,​ b<​sub>​i</​sub>​] din cele N, să existe un punct x din M care să aparțină intervalului [a<​sub>​i</​sub>,​ b<​sub>​i</​sub>​]. Complexitate:​ O(N log N)
 +Exemplu:
 +
 +  *intrare: N = 5, intervalele:​ [0, 2], [1, 7], [2, 6], [5, 14], [8, 16]
 +  *ieșire: M = {2, 14}
 +  *explicație:​ punctul 2 se afla în primele 3 intervale, iar punctul 14 în ultimele 2
 +
 +Soluție: Se observa că dacă x este un punct din M care nu este capăt dreapta al nici unui interval, o translație a lui x la dreapta care îl duce în capătul dreapta cel mai apropiat nu va schimba intervalele care conțin punctul. Prin urmare, exista o mulțime de cardinal minim M pentru care toate punctele x sunt capete dreapta.
 +
 +Astfel, vom crea mulțimea M folosind numai capete dreapta în felul următor:
 +  *cât timp au mai rămas intervale nemarcate:
 +  *selectăm cel mai mic capăt dreapta, B<​sub>​min</​sub>;​ acesta trebuie să fie în M, deoarece este singurul punct care se afla în interiorul intervalului care se termină în B<​sub>​min</​sub>​
 +  *marcăm toate intervalele nemarcate care conțin B<​sub>​min</​sub>​
 +  *adăugăm B<​sub>​min</​sub>​ la M
 +
 +Pentru a obține o complexitate redusă, sortăm inițial toate cele 2N capete și le parcurgem de la stânga la dreapta. Pentru fiecare punct distingem cazurile:
 +
 +  *dacă este capăt stânga, introducem intervalul în lista de „intervale în procesare” și trecem mai departe;
 +  *dacă este capăt dreapta și intervalul respectiv nu conține nici un punct din M, atunci am găsit cel mai mic capăt dreapta al unui interval nemarcat, introducem capătul în M și marcăm toate intervalele din lista de intervale în procesare;
 +  *dacă este capăt dreapta și intervalul din care face parte este deja marcat, trecem mai departe.
 +
 +Complexitate:​
 +
 +  *sortare: O(N log N)
 +  *parcurgerea capetelor: O(N)
 +  *adăugarea și ștergerea unui interval din lista de intervale în procesare: O(1)
 +  *total: O(N log N)
 +
 +===== Problema rucsacului =====
 +
 +O alta problemă clasică este problema rucsacului. Se dau niște obiecte care au o anumită greutate și un anumit cost, și un rucsac în care se poate pune maxim o greutate G. Se cere să se selecteze niște obiecte a.î. greutatea lor să fie maxim G și costul lor să fie maxim.
 +
 +TODO: am nevoie de enunt in acest loc???
 +
 +===== Concluzii şi observații =====
 +Aspectul cel mai important de reținut este că soluțiile găsite trebuie să reprezinte optimul global și nu doar local. Se pot confunda ușor problemele care se rezolvă cu Greedy cu cele care se rezolvă prin Programare Dinamică.
 +
 +
 +====== Probleme laborator ======
 +
 +<note important>​
 +Denumirile diferă între engleză și română! Nu știm din ce motive avem aceste diferențe între concepte și nici când au apărut pentru prima dată, dar considerăm că este bine să le cunoașteți. Atunci când citiți enunțuri în limba română sau engleză, ele se vor referi la lucruri diferite.
 +
 +Daca avem un sir a1, a2, ..., an atunci:
 +
 +  * **subșir** (//​subsequence//​ in engleza) inseamna un vector ''​v = (a(i1), a(i2), ...., a(ik))''​ unde ''​i1 < i2 < ... < ik''​.
 +  * **subsecvență** (//​substring//​ in engleza) inseamna un subșir de forma ''​a(i),​ a(i+1), a(i+2), .., a(i+k)''​ adica un subsir cu elemente consecutive in sirul initial.
 +</​note>​
 +===== Laborator 2 =====
 +
 +<note important>​
 +La finalul laboratorului,​ încărcați soluțiile [[http://​cs.curs.pub.ro/​2016/​mod/​assign/​view.php?​id=4832|aici]].
 +</​note>​
 +
 +==== Problema 1. ====
 +=== Problema rucsacului (varianta continuă) ===
 +
 +Un camion poate transporta T tone de material. Există n tipuri de materiale disponibile,​ fiecare caracterizat de greutatea G[i] disponibilă și de valoarea V[i] adusă de transportarea sa. Să se decidă ce cantități din fiecare material vor fi transportate pentru a aduce o valoare maximă.
 +
 +==== Problema 2. ====
 +=== Planificarea temelor de către studenți ===
 +
 +Pe parcursul unui semestru, un student are de rezolvat n teme. Se cunoaște enunțul tuturor celor n teme de la începutul semestrului. Timpul de rezolvare pentru oricare dintre teme este de o săptămână și nu se poate lucra la mai multe teme în același timp. Pentru fiecare tema se cunoaște un termen limita d[i] (exprimat în săptămâni) și un punctaj w[i]. Nicio fracțiune din punctaj nu se mai poate obține după expirarea termenului limită. Să se definească o planificare de realizare a temelor, în așa fel încât punctajul obținut să fie maxim.
 +
 +==== Problema 3. ====
 +=== Numere de tip palindrom ===
 +
 +Se dorește construirea a două numere de tip palindrom, primul de lungime L, al doilea de lungime > 0 astfel încât suma lor să fie minimă. Cele două numere de tip palindrom nu pot să înceapă cu cifra 0. Pentru construirea lor, se dau numărul L și numărul de apariții al fiecărei cifre în cele două numere (adică c[i] = nr. de apariții al cifrei i în primul numărul + nr. de apariții al cifrei i în al doilea număr).
 +
 +<note tip>
 +Exemplu:
 +<​code>​
 +L = 4
 +c[] = {1, 2, 2, 0, 0, 2, 0, 0, 2, 2}
 +
 +Soluţie:
 +Palindroamele care se doresc a fi generate sunt 1250521, respectiv 8998
 +cu suma minimă 1259519
 +</​code>​
 +</​note>​
 +
 +
 +<​hidden>​==== Problema 1. [4p] ====
 +
 +Se dorește parcurgerea unui drum între doua localități A și B. Cunoscând distanța către toate benzinăriile de pe ruta A->B față de orașul A și știind că având rezervorul plin se pot parcurge maxim **m** kilometri, să se facă o planificare astfel încat numărul de opriri la benzinării să fie minim. De asemenea, se garantează faptul că distanța dintre oricare doua benzinării consecutive este mai mică de **m** kilometri.
 +
 +<note tip>
 +Distanța către benzinării se reprezintă printr-o listă de forma: 0 < d1 < d2 < ... < dn, unde di, i >= 1 și i < n reprezintă distanța până la benzinăria i față de orașul A, iar dn reprezintă distanța dintre orașul A și B. De asemenea, se consideră că din orașul A se pleacă cu rezervorul plin.
 +</​note>​
 +
 +[Greedy] Se alimentează doar dacă nu se poate ajunge la benzinăria următoare.
 +</​hidden>​
 +<​hidden>​
 +==== Problema 2. [4p] ====
 +
 +  * [2p] **a)** Într-un magazin din PAlești se află o casă de marcat.. În casa de marcat există un număr nelimitat de banconte cu valori în ''​B = {v1,​v2,​...,​vn}''​. Știind că Dinamicel trebuie să primească un rest de x lei, determinați numărul minim de banconte prin care Dinamicel va primi restul.
 +<note tip>
 +Exemplu:
 +<​code>​
 +B = {1, 3, 4, 10, 60, 80}, x = 121
 +soluție: 3 bancnote (două de 60 și una de 1)
 +</​code>​
 +</​note>​
 +
 +
 +[PD] Se calculeaza C[p] = numarul minim de bancnote necesare pentru a da restul p si S[p] = indexul urmatoarei monede necesare pentru a da restul p pentru fiecare p intre 0 si x.
 +
 +
 +  * [2p] **b)** În același magazin din PAlești, s-au scos din uz bancnotele vechi și în locul lor există banconte de ''​B = {100, 50, 10, 5 , 1}''​. Ajutați-l pe Lăcomel să primească restul de x lei cu un numar minim de banconte.
 +Putem folosi aceeași tehnică de la subpunctul a)? Care este diferența de complexitate între cele două soluții? ​
 +Încercați să rezolvați acum subpunctul a) cu această tehnică.
 +
 +<note tip>
 +Exemplu:
 +<​code>​
 +x = 91
 +soluție: 6 bancnote (una de 50, patru de 10 și una de 1)
 +</​code>​
 +</​note>​
 +
 +<​hidden>​
 +[Greedy] Se aleg bancnotele in ordinea descrescătoare a valorii.
 +</​hidden>​
 +<​hidden>​
 +==== Problema 3. [4p] ====
 +
 +<note important>​
 +Pentru aceasta problemă **asistentul va alege** un subpunct pe care să îl rezolvați.
 +</​note>​
 +
 +**3.1.** Dându-se două șiruri S1 și S2, găsiți cel mai lung subșir comun a lor. Un subșir este o submulțime în care elementele păstrează ordinea relativă din șirul ințial.
 +<note tip>
 +Exemplu: ​
 +<​code>​
 +S1 = {P,​R,​O,​G,​R,​A,​M},​ S2 = { R,​A,​N,​D,​O,​M}
 +soluție: {R,A,M} sau {R,O,M}
 +</​code>​
 +</​note>​
 +
 +[PD] L[xi][yj] = lungimea celui mai lung subșir comun pentru prefixul xi al primului șir și prefixul yj al celui de-al doilea.
 +
 +**3.2.** ​ Dându-se un șir ''​S = {s1,​s2,​...,​sn}'',​ găsiți cea mai lunga subsecvență a lui ''​S,​ Sij = {si, si+1,​..,​sj}''​ care este în același timp și palindrom.
 +
 +[PD] L[i][j]=1 cand de la i la j avem palindrom.
 +</​hidden>​
 +
 +
 +===== Secţiune de aprofundare - Laborator 02 =====
 +
 +<note important>​
 +Secţiunea de aprofundare presupune discutarea şi înţelegerea unor **probleme mai dificile de algoritmică**,​ ce au ca tematică conceptele prezentate la cursul de Proiectarea Algoritmilor şi în cadrul laboratorului,​ până în prezent, fiind alcătuită din probleme întâlnite la diverse **concursuri de programare, interviuri sau literatura de specialitate**.
 +
 +Parcurgerea subiectelor din cadrul acestei secţiuni **nu este obligatorie**,​ însă conduce la o înţelegere **mai în profunzime** a noţiunilor introduse la laborator.
 +</​note>​
 +
 +Propunem astfel ca temă de gândire şi rezolvare, următoarele probleme:
 +
 +  * **1.** Se dorește parcurgerea unui drum între două localități **A** și **B**. Cunoscând distanța către toate benzinăriile de pe ruta ''​A→B''​ față de orașul A și știind că având rezervorul plin se pot parcurge maxim ''​m''​ kilometri, să se facă o planificare astfel încât numărul de opriri la benzinării să fie minim. De asemenea, se garantează faptul că distanța dintre oricare două benzinării consecutive este mai mică de m kilometri.
 +
 +<note tip>
 +Distanța către benzinării se reprezintă printr-o listă de forma: ''​0 < d1 < d2 < … < dn'',​ unde ''​di,​ i >= 1 și i < n''​ reprezintă **distanța până la benzinăria i față de orașul A**, iar ''​dn''​ reprezintă **distanța dintre orașul A și B**. De asemenea, se consideră că din orașul A se pleacă cu rezervorul plin.
 +</​note>​
 +
 +  * **2.** Propunem, de asemenea, spre citire şi înţelegere un **articol** interesant, cu detalii foarte bine explicate, ce urmăreşte rezolvarea unei probleme clasice de Greedy de **planificare a activităţilor**. Vă invităm, astfel, să urmăriţi, şi dintr-o altă perspectivă,​ why **[[https://​www.topcoder.com/​community/​data-science/​data-science-tutorials/​greedy-is-good/​|Greedy is good]]**
 +
 +===== Laborator 3 =====
 +
 +<note important>​
 +La finalul laboratorului,​ încărcați soluțiile [[http://​cs.curs.pub.ro/​2016/​mod/​assign/​view.php?​id=4978|aici]].
 +</​note>​
 +
 +==== Problema 1. ====
 +
 +=== Problema Rucsacului (varianta discretă) ===
 +
 +Un camion poate transporta **T** tone de mobilă. Există **n** piese de mobilă, fiecare caracterizată de greutatea **G[i]** și de valoarea **V[i]** adusă de transportarea sa. Să se decida ce piese de mobila vor fi transportate pentru a aduce o valoare maximă (soluție optimă).
 +
 +<note tip>
 +Exemplu:
 +
 +Fie cantitatea maximă admisă T = 10, şi un număr de piese de mobilă din care putem alege egal cu 6.
 +Piesele de mobilă sunt descrise de perechi de forma (greutate, valoare), după cum urmează:
 +(3, 7), (3, 4), (1, 2), (1, 9), (2, 4), (1, 5).
 +
 +Profitul maxim pe care îl putem obţine este 29 şi acesta se realizează dacă vom transporta obiectele de mobilier cu indecşii 1, 2, 4, 5 şi 6. 
 +
 +</​note>​
 +
 +
 +
 +==== Problema 2. ====
 +
 +=== Aranjarea cărților în bibliotecă ===
 +
 +Se dau **n** dulapuri aflate într-o bibliotecă,​ precum și numărul cărților din fiecare dulap. Se doreşte mutarea dulapurilor (cu toate cărțile aferente) într-o nouă bibliotecă (păstrând ordinea din biblioteca inițială),​ astfel încât primul dulap este mutat întotdeauna,​ iar celelalte dulapuri se mută doar dacă nu sunt așezate unul lângă celălalt în biblioteca inițială. De asemenea, se dorește soluția care maximizează numărul cărților din noua bibliotecă. // Complexitate temporală dorită: O(n) //
 +
 +<​hidden>​
 +Fie c_max[i] = numărul maxim de cărți ce pot fi transferate utilizând cărțile existente pe dulapurile de la 1 la i-2, astfel încât să fie selectat și dulapul i. Formula de recurență obţinută este c_max(i) = cărţi(i) + maxim{c_max(k) unde k = 1, i-2}. Se observă că la fiecare pas trebuie ales maximul dintre c_max(i-2) și c_max(i-3). Răspunsul este dat de maximul din c_max.
 +</​hidden>​
 +
 +
 +==== Problema 3. ====
 +
 +=== Parantezarea unei expresii booleene ===
 +
 +Se dă o expresie booleană exprimată prin stringurile // “true”, “false”,​ “and”, “or”, “xor” //. Număraţi modurile în care se pot aşeza paranteze astfel încât rezultatul să fie “true”.  ​
 +<​hidden>//​ Complexitate temporală dorită: O(N<​sup>​3</​sup>​) // </​hidden>​
 +
 +Spre exemplu, pentru expresia:
 +<​code>​ true and false xor true </​code>​
 +
 +există două modalităţi de parantezare,​ astfel încât rezultatul să fie “true”:
 +<note tip> ​
 +<​code>​
 +((true and false) xor true) </​code>​
 +sau
 +<​code>​
 +true and (false xor true))
 +</​code>​
 +</​note>​
 +
 +<​hidden>​
 +Se folosește o matrice pentru a stoca soluții parțiale, cu semnificația A[i][j] este numărul de parantezări asupra sub-expresiei formată din termenii pornind de la i și terminand cu j, astfel încât rezultatul sub-expresiei să fie true. Pozitiile se pot referi doar la elementele operanzi (de pe pozițiile 0, 2, 4 etc.). Pentru simplitate, se poate utiliza o matrice separată care sa stocheze numărul de parantezări ale sub-expresiilor în asa fel încât rezultatul sa fie false . Cele două matrici vor fi simetrice; prin urmare, acestea pot fi completate pe subdiagonale,​ doar deasupra diagonalei principale, caz în care rezultatul final se va regasi în coltul din dreapta sus al matricei true.
 +</​hidden>​
 +
 +
 +<​hidden>​
 +==== Problema 1. [4p] ====
 +
 +X este student în anul 2 și din acest motiv, are de rezolvat un număr de N teme pe parcursul celui de-al doilea semestru. Fiecare temă i are un punctaj (P_i) și poate fi rezolvată până la un anumit termen limită (D_i). Fiind un student bun, X poate rezolva orice temă într-o singura zi. Ajutați-l pe X să-și planifice temele astfel încât să obțină un punctaj cât mai mare.
 +</​hidden>​
 +
 +<​hidden>​
 +==== Problema 2. [4p] ====
 +
 +<note warning>
 +Această problema nu are schelet de cod. După rezolvarea problemei, soluția va fi încărcată pe Moodle împreuna cu restul rezolvărilor (la fel ca la toate laboratoarele de până acum).
 +</​note>​
 +
 +Se dă o hartă sub forma unei matrice de **N** linii și **M** coloane. În fiecare pătrațel se poate găsi un număr (≥ 0) de monede sau un obstacol (codificat cu valoarea -1).
 +
 +Se cere determinarea unui drum care pleacă din colțul stânga-sus (linia 0, coloana 0) și ajunge în colțul dreapta-jos (linia N - 1, coloana M - 1) pe parcursul căruia putem aduna numărul maxim de monede. La fiecare pas, ne putem deplasa din poziția (i, j) în una din pozițiile (i, j + 1) sau (i + 1, j). Nu putem intra într-un patrățel ce conține obstacol și nici nu putem ieși în afara hărții.
 +
 +<note tip>
 +Hint: Calculați, pentru fiecare poziție de pe hartă, numărul maxim de monede pe care îl puteți aduna parcurgând un drum oarecare din poziția inițială până în cea curentă.
 +</​note>​
 +</​hidden>​
 +
 +
 +<​hidden>​
 +==== Problema 3. [3p pentru O(N) sau 4p pentru O(log N)] ====
 +
 +Bill este un pasionat de fotbal și își dorește să urmeze o carieră în domeniu. Fiind un om prevăzător,​ își pune problema ce va face dacă lucrurile nu vor decurge așa cum dorește el. Spre exemplu, ar dori o modalitate de a-și ocupa timpul în cazul în care va fi constrâns din punct de vedere spațial.
 +
 +Una din activitățile care îi fac plăcere este să scrie în toate modurile posibile o sumă alcătuită din **N** termeni astfel încât acea sumă să dea restul **R** la împărțirea prin **100**. De asemenea, el dorește să folosească doar primele **20** de numere naturale pe post de termeni.
 +
 +Pentru a aproxima cât timp va putea petrece astfel, vă roagă pe voi să determinați numărul de moduri, **modulo 9901**.
 +
 +<note tip>
 +Hint: [[http://​ocw.cs.pub.ro/​courses/​pa/​laboratoare/​laborator-02#​al_n-lea_termen_fibonacci|Al N-lea termen Fibonacci]]
 +
 +Exemplu:\\
 +Pentru N = 3 și R = 2 există 6 moduri:
 +  * 0 + 1 + 1 = 2 //mod 100//
 +  * 1 + 0 + 1 = 2 //mod 100//
 +  * 1 + 1 + 0 = 2 //mod 100//
 +  * 0 + 0 + 2 = 2 //mod 100//
 +  * 0 + 2 + 0 = 2 //mod 100//
 +  * 2 + 0 + 0 = 2 //mod 100//
 +
 +</​note>​
 +</​hidden>​
 +
 +
 +===== Secţiune de aprofundare - Laborator 03 =====
 +
 +<note important>​
 +Secţiunea de aprofundare presupune discutarea şi înţelegerea unor **probleme mai dificile de algoritmică**,​ ce au ca tematică conceptele prezentate la cursul de Proiectarea Algoritmilor şi în cadrul laboratorului,​ până în prezent, fiind alcătuită din probleme întâlnite la diverse **concursuri de programare, interviuri sau literatura de specialitate**.
 +
 +Parcurgerea subiectelor din cadrul acestei secţiuni **nu este obligatorie**,​ însă conduce la o înţelegere **mai în profunzime** a noţiunilor introduse la laborator.
 +</​note>​
 +
 +Propunem astfel ca temă de gândire şi rezolvare, următoarele probleme:
 +
 +
 +  * **1.** **O problemă de exponenţiere optimă de matrici.** Bill este un pasionat de fotbal și își dorește să urmeze o carieră în domeniu. Fiind un om prevăzător,​ își pune problema ce va face dacă lucrurile nu vor decurge așa cum dorește el. Spre exemplu, ar dori o modalitate de a-și ocupa timpul în cazul în care va fi constrâns din punct de vedere spațial.
 +
 +Una din activitățile care îi fac plăcere este să scrie în toate modurile posibile o sumă alcătuită din **N** termeni astfel încât acea sumă să dea restul **R** la împărțirea prin **100**. De asemenea, el dorește să folosească doar primele **20** de numere naturale pe post de termeni.
 +
 +Pentru a aproxima cât timp va putea petrece astfel, vă roagă pe voi să determinați numărul de moduri, **modulo 9901**.
 +
 +<note tip>
 +Hint: [[http://​ocw.cs.pub.ro/​courses/​pa/​laboratoare/​laborator-02#​al_n-lea_termen_fibonacci|Al N-lea termen Fibonacci]]
 +
 +Exemplu:\\
 +Pentru N = 3 și R = 2 există 6 moduri:
 +  * 0 + 1 + 1 = 2 //mod 100//
 +  * 1 + 0 + 1 = 2 //mod 100//
 +  * 1 + 1 + 0 = 2 //mod 100//
 +  * 0 + 0 + 2 = 2 //mod 100//
 +  * 0 + 2 + 0 = 2 //mod 100//
 +  * 2 + 0 + 0 = 2 //mod 100//
 +
 +</​note>​
 +
 +===== Referințe =====
 +
 +[1] [[http://​en.wikipedia.org/​wiki/​Greedy_algorithm]]
 +
 +[2] [[http://​en.wikipedia.org/​wiki/​Dynamic_programming]]
 +
 +[3] [[http://​ww3.algorithmdesign.net/​handouts/​Greedy.pdf]]
 +
 +[4] [[http://​ww3.algorithmdesign.net/​handouts/​DynamicProgramming.pdf]]
 +
 +[5] [[http://​infoarena.ro/​problema/​scmax]]
 +
 +[6] [[http://​infoarena.ro/​problema/​ssm]]
 +
 +[7] Capitolul IV din Introducere în Algoritmi de către T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein
  
pa/laboratoare/backup-lab02.txt · Last modified: 2018/02/21 01:32 by darius.neatu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0