Differences

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

Link to this comparison view

pa:laboratoare:laborator-01 [2026/02/25 18:40]
darius.neatu
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 535: Line 535:
  
  
-===== Exercitii ​=====+===== Implementarea algoritmilor standard ​=====
 <​note>​ <​note>​
-Scheletul de laborator se găsește pe pagina ​[[https://​github.com/​acs-pa/​pa-lab/​tree/​main/​skel/lab03|pa-lab::skel/lab03]].+[[https://​github.com/​acs-pa/​pa-lab/​tree/​main/​algorithms/lab01|pa-lab/algorithms/​lab01]] conține implementarea algoritmilor standard / tehnicilor / tiparelor de algoritmi pentru acest laborator.
 </​note>​ </​note>​
  
-=== 1. Not again! === 
-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. Cunoscand aceasta informatie (data sub forma unui vector **v** cu **n** elemente), el se intreaba care este numarul minim de monede cu care poate plati o **suma S**. 
  
-Task-uri: +===== Pool probleme ​(pentru prezentări=====
-  * 1.1 **Determinati numarul minim de monede** ​(din cele pe care le arecu care Gigel poate forma suma S.  +
-  * 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**.+======= ​1) Edit Distance =======
  
-<spoiler Exemplu 1> +**Enunt:​**  ​ 
-$ n = 4$ si $ S = 12$ +Se dau două șiruri de caractere ''​a''​ ș''​b''​. ​  
-|i|1|2|3|4| +Într-o singură operație se poate: 
-|v|1|2|3|6|+  * insera un caracter, 
 +  * șterge un caracter, 
 +  * înlocui un caracter cu altul.
  
-Raspuns: $2$+Determinați numărul minim de operații necesare pentru a transforma șirul ''​a''​ în șirul ''​b''​.
  
-Explicatie: Avem 4 tipuri ​de monede1 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. +**Date ​de intrare:**   
-Suma 12 poate fi obtinuta in urmatoarele moduri: +Se citesc două șiruri de caractere.
-  ​$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$. +**Date de ieșire:​** ​  
-</​spoiler>​+Se afișează un singur număr întreg — distanța ​minimă de editare dintre cele două șiruri.
  
-<spoiler Exemplu 2> +Problema se poate testa la:  ​ 
-$ n = 3$ si $ S = 11$ +https://​cses.fi/​problemset/​task/​1639
-|i|1|2|3| +
-|v|1|2|5|+
  
-Raspuns: $3$ 
  
-Explicatie: Avem 3 tipuri de monede: 1 euro, euro si 5 euro (lui Gigel nu ii mai place sa foloseasca RON). Avem la dispozitie oricate monede din fiecare tip. +======= ​2) Projects ​=======
-Suma 11 poate fi obtinuta in urmatoarele moduri: +
-  * $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$+**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).
  
 +Determinați profitul maxim care poate fi obținut alegând un subset de proiecte compatibile.
  
-<spoiler Exemplu 3> +**Date de intrare:​**  ​ 
-= 3$ si $ S = 11$ +Pe prima linie se află un număr întreg ''​n''​.  ​ 
-|i|1|2|3| +Pe următoarele ''​n''​ linii se află câte trei numere întregi ''​a'',​ ''​b'',​ ''​p''​.
-|v|2|4|6|+
  
-Raspuns$-1$+**Date de ieșire:**   
 +Se afișează un singur număr întreg — profitul maxim posibil.
  
-ExplicatieNu putem forma suma 11 folosind tipurile (valorile) 2, 4, 6. +Problema se poate testa la  
-</spoiler>+https://​cses.fi/​problemset/​task/1140
  
-<​hidden>​ 
-<spoiler Solutie> 
-Problema preluata de [[https://​leetcode.com/​problems/​coin-change/​description/​|aici]]. Solutia este [[https://​leetcode.com/​problems/​coin-change/​solution/​ | aici]]. 
-</​spoiler>​ 
-</​hidden>​ 
  
-=== 2. CMLSC === +======= 3Russian Doll Envelopes =======
-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.+
  
-Task-uri: +**Enunt:**   
-  ​2.1 **Determinare lungime** CMLSC. (Hint: DP) +Se dă un vector de plicuri, unde fiecare plic este reprezentat prin două valori: lățimea și înălțimea sa  
-  * 2.2 **Reconstituire** CMLSC (afisati si care sunt termenii CMLSC). +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.
-  * 2.3 Care este **complexitatea** solutiei (timp + spatiu)? De ce?+
  
-Rezolvati in ordine task-urile.+Determinați numărul maxim de plicuri care pot fi introduse unul în altul.
  
 +**Date de intrare:​**  ​
 +Un vector bidimensional ''​envelopes'',​ unde ''​envelopes[i] = [w_i, h_i]''​.
  
-<​note>​ +**Date de ieșire:**   
-**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$. +Un număr întreg reprezentând numărul maxim de plicuri care pot fi imbricate.
-</​note> ​+
  
-<spoiler Exemplu 1> +Problema se poate testa la:  ​ 
-$ n = 3 $ si $ m = 5$ +https://​leetcode.com/​problems/​russian-doll-envelopes/​description/​
-|i|1| 2|3| +
-|v|6|-1|9|+
  
-|j|1| 2|3|4|5| 
-|w|0|6|2|9|8| 
  
-Raspuns: $lungime ​2$, $CMLSC ​[6, 9]$+======= 4) Largest Divisible Subset =======
  
-ExplicatieToate subsirurile comune posibile sunt: +**Enunt:*  
-  ​$[6]$ +Se dă un vector de numere întregi distincte. ​  
-  * $[6, 9]$ +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''​.
-  ​* $[9]$ +
-Solutia mentionata are lungime maxima. +
-</​spoiler>​+
  
 +Dacă există mai multe soluții, se poate afișa oricare dintre ele.
  
-<spoiler Exemplu 2> +**Date de intrare:​**  ​ 
-$ n = 8 $ si $ m = 5$ +Un vector de numere întregi distincte ''​nums''​.
-|i|1|2|3|4|5|6|7|8| +
-|v|2|1|5|3|4|5|2|7|+
  
-|j|1|2|3|4|5| +**Date de ieșire:​**  ​ 
-|w|1|5|5|7|4|+Un vector care reprezintă un subset valid de dimensiune maximă.
  
-Raspuns$lungime = 4$, $CMLSC = [1, 5, 5, 7]$+Problema se poate testa la  
 +https://​leetcode.com/​problems/​largest-divisible-subset/​description/​
  
-Explicatie: Toate subsirurile comune posibile sunt (duplicatele vor fi mentionate o singura data): 
-  * $[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>​ 
  
 +======= 5) Best Time to Buy and Sell Stock III =======
  
 +**Enunt:​**  ​
 +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).  ​
  
-<spoiler Exemplu 3> +Nu putețdeține mai multe acțiuni simultan (trebuie să vindeți înainte de a cumpăra din nou).
-$ 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| +Determinați profitul maxim care poate fi obținut.
-|w|1|5|7|-5|4|+
  
-Raspuns$lungime = 3$, $CMLSC = [1, 5, 7]$ (exemplu ​de solutie)+**Date de intrare:**   
 +Un vector ​de numere întregi ''​prices''​.
  
-Explicatie: Toate subsirurile comune posibile sunt (duplicatele vor fi mentionate o singura data): +**Date de ieșire:**   
-  ​$[1]$ +Un număr întreg reprezentând profitul maxim posibil.
-  ​$[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>​+
  
 +Problema se poate testa la:  ​
 +https://​leetcode.com/​problems/​best-time-to-buy-and-sell-stock-iii/​description/​
  
-<​hidden>​ +===== Extra (studiu ​de caz pentru acasă) ​ =====
-<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]$ +<spoiler Coin Change> 
-  * $dp[i][0] = 0$ ; $dp[0][j] = 0$ +Rezolvati pe leetcode problema ​[[ https://​leetcode.com/​problems/​coin-change/​description/​ | Coin Change]]
-  * $dp[i][j] = (v[i] == w[j] \ ? \ dp[i-1][j-1] + 1 max(dp[i][j-1], dp[i-1][j])$+</​spoiler>​
  
-Solutia este $dp[n][m]$Reconstituirea se face pe baza matricei dp. Din starea (ij) 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. +<spoiler CMLSC> 
-Complexitate:​ $O(n * m)$.+Rezolvati pe infoarena problema ​[[https://​infoarena.ro/​problema/​cmlsc| CMLSC]]. Similarproblema ​se poate găsi ș[[Leetcode | https://​leetcode.com/​problems/​longest-common-subsequence/​description/​]].
 </​spoiler>​ </​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>​
- 
- 
-=== Extra ===  
- 
  
 <spoiler Rucsac> <spoiler Rucsac>
pa/laboratoare/laborator-01.1772037617.txt.gz · Last modified: 2026/02/25 18:40 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