Appearance
Secvențe
Obs: O secventa poate fi și de lungime 1.
Def : Secvența maximă (de lungime maximă) - dintre toate secvențele, este secvența de lungime maxima care indeplineste proprietatea P (unde P o proprietate din enunț - “secvența de numere pare”).
Ex : 2 3 7 8 6 4 6 5 8 8 9 4 4 4 4 ( pentru P - “secvența de numere pare” avem secvențele subliniate ca fiind secvențe maxime)
Def : Secvența maximală - dacă aș mai încerca să mai adaug un element (fie la dreapta (la final), fie la stânga (la început) ), secvența obținută nu ar mai respecta proprietatea.
(în alte cuvinte, secvența “mai bine de atât nu se poate”)
Ex : 2 3 7 8 6 4 6 5 8 8 9
Obs: Orice secventa maxima este si secventa maximala, dar NU si invers (in ex de mai sus, “8 8” nu este maximă!)
Vom numi “exemplu” - element ce îndeplinește P
Idee (pt găsirea secv de lungime maximă):
Dacă elem. curent este exemplu
cpp
lg++;
Altfel // am contraex - deci secvența mea tocmai s-a terminatVerific daca lg este maxim - Dacă da, actualizez maximul
lg devine 0 (Am contraex - secv curentă s-a terminat)
Obs: Uneori chiar contraexemplul poate forma o secventa. De exemplu, pentru P = “secvența de numere crescătoare”:
Ex : 2 3 4 7 3 5 9 11
Doar “3” este o secventa cresc => de fiecare data cand gasesc contraex
, după ce “m-am jucat” cu secvența curentă, voi face “lg = 1” (pt ca contraex face parte din următoarea secvența).
Obs: Cu algoritmul de mai sus, obțin o secventă maximală de fiecare dată când dau de contraexemplu.
Obs: De la a la b am b-a+1 nr.
Ex : de la 3 la 7 am 5 nr ( 3, 4, 5, 6, 7)
cpp
// 10
// 0 1 0 0 0 5 0 0 0 0
// ultima secvență nu are după ea un “contraexemplu” pt a verifica dacă este maximăSoluții :
cpp
Pe poziția n+1 voi pune contraexemplu, și voi parcurge 1->n+1.După ce am parcurs șirul, verific daca secv curentă este maximă.