Differences

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

Link to this comparison view

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ț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 + + 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ț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 monede1 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. (HintDP) +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 subsetfie ''​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ă.
  
-ExplicatieToate 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]]. Similarproblema se poate găsi și [[Leetcode | https://​leetcode.com/​problems/​longest-common-subsequence/​description/​]].
-  * $[1, 5]$  +
-  * $[1, 7]$   +
-  * $[14]$ +
-  * $[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>
pa/laboratoare/laborator-01.1772353954.txt.gz · Last modified: 2026/03/01 10: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