This shows you the differences between two versions of the page.
|
pa:laboratoare:laborator-01 [2026/03/01 10:32] darius.neatu [Exercitii] |
pa:laboratoare:laborator-01 [2026/03/04 11:39] (current) radu.nichita [Pool probleme (pentru prezentări)] |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| ===== Precizări inițiale ===== | ===== Precizări inițiale ===== | ||
| <note> | <note> | ||
| - | Toate exemplele de cod se găsesc pe pagina [[https://github.com/acs-pa/pa-lab/tree/main/demo/lab03|pa-lab::demo/lab03]]. | + | Toate exemplele de cod se găsesc pe pagina [[https://github.com/acs-pa/pa-lab/tree/main/algorithms/lab01|pa-lab/algorithms/lab01]]. |
| Exemplele de cod apar încorporate și în textul laboratorului pentru a facilita parcurgerea cursivă a acestuia. ATENȚIE! Varianta actualizată a acestor exemple se găsește întotdeauna pe GitHub. | Exemplele de cod apar încorporate și în textul laboratorului pentru a facilita parcurgerea cursivă a acestuia. ATENȚIE! Varianta actualizată a acestor exemple se găsește întotdeauna pe GitHub. | ||
| Line 13: | Line 13: | ||
| * Toate bucățile de cod prezentate în partea introductivă a laboratorului (înainte de exerciții) au fost testate. Cu toate acestea, este posibil ca din cauza mai multor factori (formatare, caractere invizibile puse de browser etc) un simplu copy-paste să nu fie de ajuns pentru a compila codul. | * Toate bucățile de cod prezentate în partea introductivă a laboratorului (înainte de exerciții) au fost testate. Cu toate acestea, este posibil ca din cauza mai multor factori (formatare, caractere invizibile puse de browser etc) un simplu copy-paste să nu fie de ajuns pentru a compila codul. | ||
| - | * Vă rugam să compilați **DOAR** codul de pe GitHub. Pentru raportarea problemelor, contactați unul dintre maintaineri. | + | * Vă rugăm să compilați **DOAR** codul de pe GitHub. Pentru raportarea problemelor, contactați unul dintre maintaineri. |
| * Pentru orice problemă legată de conținutul acestei pagini, vă rugam să dați e-mail unuia dintre responsabili. | * Pentru orice problemă legată de conținutul acestei pagini, vă rugam să dați e-mail unuia dintre responsabili. | ||
| Line 540: | Line 540: | ||
| </note> | </note> | ||
| - | * [[https://github.com/acs-pa/pa-lab/tree/main/algorithms/lab01/ssm|pa-lab/algorithms/lab01/ssm]] | ||
| - | * [[https://github.com/acs-pa/pa-lab/tree/main/algorithms/lab01/scmax|pa-lab/algorithms/lab01/scmax]] | ||
| - | * [[https://github.com/acs-pa/pa-lab/tree/main/algorithms/lab01/rucsac|pa-lab/algorithms/lab01/rucsac]] | ||
| ===== Pool probleme (pentru prezentări) ===== | ===== Pool probleme (pentru prezentări) ===== | ||
| + | ======= 1) Edit Distance ======= | ||
| - | ===== Extra (studiu de caz pentru acasă) ===== | + | **Enunt:** |
| + | Se dau două șiruri de caractere ''a'' și ''b''. | ||
| + | Într-o singură operație se poate: | ||
| + | * insera un caracter, | ||
| + | * șterge un caracter, | ||
| + | * înlocui un caracter cu altul. | ||
| - | === Gigel and coins === | + | Determinați numărul minim de operații necesare pentru a transforma șirul ''a'' în șirul ''b''. |
| - | Gigel are o colectie impresionanta de monede. El ne spune ca are ** n tipuri** de monede, avand un numar nelimitat de monede din fiecare tip. Cunoscând această informație (dată sub forma unui vector **v** cu **n** elemente), el se întreabă care este numărul minim de monede cu care poate plăti o **sumă S**. | + | |
| - | Task-uri: | + | **Date de intrare:** |
| - | * 1.1 **Determinati numarul minim de monede** (din cele pe care le are) cu care Gigel poate forma suma S. | + | Se citesc două șiruri de caractere. |
| - | * 1.2 Care este complexitatea solutiei (timp + spatiu)? De ce? | + | |
| - | Este posibil ca pentru anumite valori ale lui S si v, aceasta problema sa nu aiba solutie. In acest caz raspunsul este **-1**. | + | **Date de ieșire:** |
| + | Se afișează un singur număr întreg — distanța minimă de editare dintre cele două șiruri. | ||
| - | <spoiler Exemplu 1> | + | Problema se poate testa la: |
| - | $ n = 4$ si $ S = 12$ | + | https://cses.fi/problemset/task/1639 |
| - | |i|1|2|3|4| | + | |
| - | |v|1|2|3|6| | + | |
| - | Raspuns: $2$ | ||
| - | Explicatie: Avem 4 tipuri de monede: 1 euro, 2 euro, 3 euro si 6 euro (lui Gigel nu ii mai place sa foloseasca RON). Avem la dispozitie oricate monede din fiecare tip. | + | ======= 2) Projects ======= |
| - | Suma 12 poate fi obtinuta in urmatoarele moduri: | + | |
| - | * $12 = 6 + 6$ | + | |
| - | * $12 = 6 + 3 + 3$ | + | |
| - | * $12 = 6 + 3 + 2 + 1$ | + | |
| - | * $12 = 6 + 2 + 2 + 2$ | + | |
| - | * $12 = 6 + 3 + 3$ | + | |
| - | * $12 = 3 + 3 + 3 + 3$ | + | |
| - | * $12 = 3 + 3 + 3 + 2 + 1$ | + | |
| - | * $12 = 3 + 3 + 2 + 2 + 2$ | + | |
| - | * $12 = 3 + 2 + 2 + 2 + 2 + 1$ | + | |
| - | * $12 = 2 + 2 + 2 + 2 + 2 + 2$ | + | |
| - | * ... (ati inteles ideea :D) | + | |
| - | Solutia cu numar minim de monede se obtine pentru modul $6 + 6$. | + | **Enunt:** |
| - | </spoiler> | + | Se dau ''n'' proiecte. Fiecare proiect este descris prin trei valori: ziua de început ''a'', ziua de sfârșit ''b'' și profitul ''p''. |
| + | Poți realiza un proiect doar dacă nu se suprapune cu alt proiect ales (intervalele nu trebuie să aibă zile comune). | ||
| - | <spoiler Exemplu 2> | + | Determinați profitul maxim care poate fi obținut alegând un subset de proiecte compatibile. |
| - | $ n = 3$ si $ S = 11$ | + | |
| - | |i|1|2|3| | + | |
| - | |v|1|2|5| | + | |
| - | Raspuns: $3$ | + | **Date de intrare:** |
| + | Pe prima linie se află un număr întreg ''n''. | ||
| + | Pe următoarele ''n'' linii se află câte trei numere întregi ''a'', ''b'', ''p''. | ||
| - | Explicatie: Avem 3 tipuri de monede: 1 euro, 2 euro si 5 euro (lui Gigel nu ii mai place sa foloseasca RON). Avem la dispozitie oricate monede din fiecare tip. | + | **Date de ieșire:** |
| - | Suma 11 poate fi obtinuta in urmatoarele moduri: | + | Se afișează un singur număr întreg — profitul maxim posibil. |
| - | * $11 = 5 + 5 + 1$ | + | |
| - | * $11 = 5 + 2 + 2 + 2$ | + | |
| - | * $11 = 5 + 2 + 2 + 1 + 1$ | + | |
| - | * $11 = 5 + 2 + 1 + 1 + 1 + 1$ | + | |
| - | * $11 = 5 + 1 + 1 + 1 + 1 + 1 + 1$ | + | |
| - | * $11 = 2 + 2 + 1 + 1 + 1 + 1 + 1 + 1 + 1$ | + | |
| - | * $11 = 2 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1$ | + | |
| - | * $11 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1$ | + | |
| - | Solutia cu numar minim de monede se obtine pentru modul $5 + 5 + 1$. | + | Problema se poate testa la: |
| - | </spoiler> | + | https://cses.fi/problemset/task/1140 |
| - | <spoiler Exemplu 3> | + | ======= 3) Russian Doll Envelopes ======= |
| - | $ n = 3$ si $ S = 11$ | + | |
| - | |i|1|2|3| | + | |
| - | |v|2|4|6| | + | |
| - | Raspuns: $-1$ | + | **Enunt:** |
| + | Se dă un vector de plicuri, unde fiecare plic este reprezentat prin două valori: lățimea și înălțimea sa. | ||
| + | Un plic poate fi introdus într-un alt plic dacă și numai dacă ambele dimensiuni (lățime și înălțime) sunt strict mai mici. | ||
| - | Explicatie: Nu putem forma suma 11 folosind tipurile (valorile) 2, 4, 6. | + | Determinați numărul maxim de plicuri care pot fi introduse unul în altul. |
| - | </spoiler> | + | |
| - | <hidden> | + | **Date de intrare:** |
| - | <spoiler Solutie> | + | Un vector bidimensional ''envelopes'', unde ''envelopes[i] = [w_i, h_i]''. |
| - | Problema preluata de [[https://leetcode.com/problems/coin-change/description/|aici]]. Solutia este [[https://leetcode.com/problems/coin-change/solution/ | aici]]. | + | |
| - | </spoiler> | + | |
| - | </hidden> | + | |
| - | === CMLSC === | + | **Date de ieșire:** |
| - | Fie doi vectori cu numere intregi: **v** cu **n** elemente si **w** cu **m** elemente. Sa se gaseasca ** cel mai lung subsir comun ** (notat **CMLSC**) care apare in cei doi vectori. Se cere o solutie de complexitate optima. Daca exista mai multe solutii, se poate gasi oricare. | + | Un număr întreg reprezentând numărul maxim de plicuri care pot fi imbricate. |
| - | Task-uri: | + | Problema se poate testa la: |
| - | * 2.1 **Determinare lungime** CMLSC. (Hint: DP) | + | https://leetcode.com/problems/russian-doll-envelopes/description/ |
| - | * 2.2 **Reconstituire** CMLSC (afisati si care sunt termenii CMLSC). | + | |
| - | * 2.3 Care este **complexitatea** solutiei (timp + spatiu)? De ce? | + | |
| - | Rezolvati in ordine task-urile. | ||
| + | ======= 4) Largest Divisible Subset ======= | ||
| - | <note> | + | **Enunt:** |
| - | **subsir** (**subsequence** in engleza) pentru un vector ** v **inseamna un alt vector $u = [v[i_1], v[i_2],..., v[i_k]]]$ unde $i_1 < i_2 < ... < i_k$. | + | Se dă un vector de numere întregi distincte. |
| - | </note> | + | Determinați cel mai mare subset astfel încât pentru orice două elemente ''a'' și ''b'' din subset, fie ''a'' îl divide pe ''b'', fie ''b'' îl divide pe ''a''. |
| - | <spoiler Exemplu 1> | + | Dacă există mai multe soluții, se poate afișa oricare dintre ele. |
| - | $ n = 3 $ si $ m = 5$ | + | |
| - | |i|1| 2|3| | + | |
| - | |v|6|-1|9| | + | |
| - | |j|1| 2|3|4|5| | + | **Date de intrare:** |
| - | |w|0|6|2|9|8| | + | Un vector de numere întregi distincte ''nums''. |
| - | Raspuns: $lungime = 2$, $CMLSC = [6, 9]$ | + | **Date de ieșire:** |
| + | Un vector care reprezintă un subset valid de dimensiune maximă. | ||
| - | Explicatie: Toate subsirurile comune posibile sunt: | + | Problema se poate testa la: |
| - | * $[6]$ | + | https://leetcode.com/problems/largest-divisible-subset/description/ |
| - | * $[6, 9]$ | + | |
| - | * $[9]$ | + | |
| - | Solutia mentionata are lungime maxima. | + | |
| - | </spoiler> | + | |
| - | <spoiler Exemplu 2> | + | ======= 5) Best Time to Buy and Sell Stock III ======= |
| - | $ n = 8 $ si $ m = 5$ | + | |
| - | |i|1|2|3|4|5|6|7|8| | + | |
| - | |v|2|1|5|3|4|5|2|7| | + | |
| - | |j|1|2|3|4|5| | + | **Enunt:** |
| - | |w|1|5|5|7|4| | + | Se dă un vector ''prices'', unde ''prices[i]'' reprezintă prețul unei acțiuni în ziua ''i''. |
| + | Puteți efectua cel mult două tranzacții (o tranzacție constă într-o cumpărare urmată de o vânzare). | ||
| - | Raspuns: $lungime = 4$, $CMLSC = [1, 5, 5, 7]$ | + | Nu puteți deține mai multe acțiuni simultan (trebuie să vindeți înainte de a cumpăra din nou). |
| - | Explicatie: Toate subsirurile comune posibile sunt (duplicatele vor fi mentionate o singura data): | + | Determinați profitul maxim care poate fi obținut. |
| - | * $[1]$ | + | |
| - | * $[1, 5]$ | + | |
| - | * $[1, 7]$ | + | |
| - | * $[1, 4]$ | + | |
| - | * $[1, 5, 5]$ | + | |
| - | * $[1, 5, 7]$ | + | |
| - | * $[1, 5, 4]$ | + | |
| - | * $[1, 5, 5, 7]$ | + | |
| - | * $[5]$ | + | |
| - | * $[5, 5]$ | + | |
| - | * $[5, 7]$ | + | |
| - | * $[5, 4]$ | + | |
| - | * $[4]$ | + | |
| - | Solutia mentionata are lungime maxima. | + | |
| - | </spoiler> | + | |
| + | **Date de intrare:** | ||
| + | Un vector de numere întregi ''prices''. | ||
| + | **Date de ieșire:** | ||
| + | Un număr întreg reprezentând profitul maxim posibil. | ||
| - | <spoiler Exemplu 3> | + | Problema se poate testa la: |
| - | $ n = 8 $ si $ m = 5$ | + | https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/ |
| - | |i|1|2|3|4|5|6|7|8| | + | |
| - | |v|2|1|5|3|4|5|2|7| | + | |
| - | |j|1|2|3| 4|5| | + | ===== Extra (studiu de caz pentru acasă) ===== |
| - | |w|1|5|7|-5|4| | + | |
| - | Raspuns: $lungime = 3$, $CMLSC = [1, 5, 7]$ (exemplu de solutie) | + | <spoiler Coin Change> |
| + | Rezolvati pe leetcode problema [[ https://leetcode.com/problems/coin-change/description/ | Coin Change]]. | ||
| + | </spoiler> | ||
| - | Explicatie: Toate subsirurile comune posibile sunt (duplicatele vor fi mentionate o singura data): | + | <spoiler CMLSC> |
| - | * $[1]$ | + | Rezolvati pe infoarena problema [[https://infoarena.ro/problema/cmlsc| CMLSC]]. Similar, problema se poate găsi și [[Leetcode | https://leetcode.com/problems/longest-common-subsequence/description/]]. |
| - | * $[1, 5]$ | + | |
| - | * $[1, 7]$ | + | |
| - | * $[1, 4]$ | + | |
| - | * $[1, 5, 7]$ | + | |
| - | * $[1, 5, 4]$ | + | |
| - | * $[5]$ | + | |
| - | * $[5, 7]$ | + | |
| - | * $[5, 4]$ | + | |
| - | * $[4]$ | + | |
| - | Solutii pot fi: $[1, 5, 7]$ si $[1, 5, 4]$. | + | |
| - | Pentru $[1, 5, 7]$, se observa ca sunt 2 astfel de subsiruri in vectorul v. Oricare este bun. | + | |
| </spoiler> | </spoiler> | ||
| - | <hidden> | ||
| - | <spoiler Solutie> | ||
| - | Problema preluata de [[https://infoarena.ro/problema/cmlsc|aici]]. | ||
| - | |||
| - | * $dp[i][j]$ = lungimea celui mai lung subsir comun pentru sub-vectorii $v[1..i]$ si $w[1..j]$ | ||
| - | * $dp[i][0] = 0$ ; $dp[0][j] = 0$ | ||
| - | * $dp[i][j] = (v[i] == w[j] \ ? \ dp[i-1][j-1] + 1 : max(dp[i][j-1], dp[i-1][j])$ | ||
| - | |||
| - | Solutia este $dp[n][m]$. Reconstituirea se face pe baza matricei dp. Din starea (i, j) se poate trece in starea $(p, q) = (i-1, j-1) sau (i-1, j) sau (i, j-1)$, pe baza relatiei dintre valorile din dp. Obtinem astfel un CMLSC inversat. | ||
| - | Complexitate: $O(n * m)$. | ||
| - | </spoiler> | ||
| - | </hidden> | ||
| - | === BONUS === | ||
| <spoiler Custi> | <spoiler Custi> | ||
| Rezolvati pe infoarena problema [[https://infoarena.ro/problema/custi | custi]]. | Rezolvati pe infoarena problema [[https://infoarena.ro/problema/custi | custi]]. | ||
| </spoiler> | </spoiler> | ||
| - | |||
| - | |||
| - | |||
| <spoiler Rucsac> | <spoiler Rucsac> | ||