This shows you the differences between two versions of the page.
pa:laboratoare:laborator-03 [2021/03/31 20:53] darius.neatu [SCMAX] |
pa:laboratoare:laborator-03 [2025/03/26 09:41] (current) andreea.dieaconu95 [SSM] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 3: Programare Dinamică ====== | + | ====== Laborator 03: Programare Dinamică (1/2) ====== |
- | Responsabili: | + | |
- | * [[neatudarius@gmail.com|Darius-Florentin Neațu (2017-2021)]] | + | |
- | * [[radunichita99@gmail.com | Radu Nichita (2021)]] | + | |
- | * [[cristianolaru99@gmail.com | Cristian Olaru (2021)]] | + | |
- | * [[mirunaelena.banu@gmail.com | Miruna-Elena Banu (2021)]] | + | |
- | * [[maraioana9967@gmail.com | Mara-Ioana Nicolae (2021)]] | + | |
- | * [[stefanpopa2209@gmail.com | Ștefan Popa (2018-2020)]] | + | |
- | + | ||
- | Autori: | + | |
- | * [[neatudarius@gmail.com|Darius-Florentin Neațu (2018)]] | + | |
- | * [[visanr95@gmail.com|Radu Vișan (2018)]] | + | |
- | * [[cristb@gmail.com|Cristian Banu (2018)]] | + | |
- | * [[razvan.ch95@gmail.com|Răzvan Chițu (2018)]] | + | |
===== Obiective laborator ===== | ===== Obiective laborator ===== | ||
Line 160: | Line 147: | ||
* În cazul SSM, avem un singur caz de bază, când avem un singur element în prefix: $dp[1] = v[1] $. | * În cazul SSM, avem un singur caz de bază, când avem un singur element în prefix: $dp[1] = v[1] $. | ||
* Explicație: dacă avem un singur element, atunci acesta formează singura subsecvență posibilă, deci $ SSM = v[1] $ | * Explicație: dacă avem un singur element, atunci acesta formează singura subsecvență posibilă, deci $ SSM = v[1] $ | ||
- | | + | |
- | * ** Cazul general ** | + | * **Cazul general** |
- | * presupune inductiv că avem rezolvate toate subproblemele mai mici | + | * presupune inductiv că avem rezolvate toate subproblemele mai mici |
- | * în cazul SSM, presupunem că avem calculat $ dp[i-1] $ și dorim sa calculăm $ dp[i] $ (cunoaștem cea mai bună soluție folosind primele i-1 elememente și vedem dacă elementul de pe poziția i o poate îmbunătăți) | + | * în cazul SSM, presupunem că avem calculat $ dp[i-1] $ și dorim sa calculăm $ dp[i] $ (cunoaștem cea mai bună soluție folosind primele i-1 elememente și vedem dacă elementul de pe poziția i o poate îmbunătăți) |
- | * la fiecare pas avem de ales dacă $v[i]$ extinde cea mai bună soluție care se termină pe $v[i-1]$ sau se începe o nouă secvență cu $v[i]$ | + | * la fiecare pas avem de ales dacă $v[i]$ extinde cea mai bună soluție care se termină pe $v[i-1]$ sau se începe o nouă secvență cu $v[i]$ |
- | * decidem în funcție de $ dp[i - 1]$ și $v[i] $ | + | * decidem în funcție de $ dp[i - 1]$ și $v[i] $ |
* ** dacă ** $ dp[i - 1] >= 0 $ (cea mai bună soluție care se termină pe i - 1 are cost nenegativ) | * ** dacă ** $ dp[i - 1] >= 0 $ (cea mai bună soluție care se termină pe i - 1 are cost nenegativ) | ||
* extindem secvență care se termină cu v[i-1] folosind elementul v[i]: $dp[i] = dp[i-1] + v[i]$ | * extindem secvență care se termină cu v[i-1] folosind elementul v[i]: $dp[i] = dp[i-1] + v[i]$ | ||
Line 324: | Line 311: | ||
* **dacă $v[j] < v[i] $**, atunci subșirul crescător care se termină pe poziția j, poate fi extins la dreapta cu elementul v[i], generând lungimea ** dp[j] + 1 ** | * **dacă $v[j] < v[i] $**, atunci subșirul crescător care se termină pe poziția j, poate fi extins la dreapta cu elementul v[i], generând lungimea ** dp[j] + 1 ** | ||
* deci dp[i] = max(dp[j] + 1), $j = 1 : i - 1$ (dacă nu există un astfel de j, valoarea lui max(...) este 0) | * deci dp[i] = max(dp[j] + 1), $j = 1 : i - 1$ (dacă nu există un astfel de j, valoarea lui max(...) este 0) | ||
- | * Ce se întamplă totuși dacă nu există un j care să îndeplinească condiția de mai sus? Atunci $v[i]$ va forma singur un subșir crescător de lungime 1 (care poate fi la un pas ulterior) | + | * Ce se întamplă totuși dacă nu există un j care să îndeplinească condiția de mai sus? Atunci $v[i]$ va forma singur un subșir crescător de lungime 1 (care poate fi folosit la un pas ulterior) |
Reunind cele spuse mai sus: | Reunind cele spuse mai sus: | ||
* $dp[1] = 1$ | * $dp[1] = 1$ | ||
- | * $dp[i] = 1 + max(dp[j])$, unde $j = 1 : i-1$ **și** $v[j] < v[i]$ | + | * $dp[i] = 1 + max(dp[j])$, unde $j = 1 : i-1$ **și** $v[j] < v[i]$; $i=2:n$ |
== Implementare recurență == | == Implementare recurență == |