Sunteți pe pagina 1din 5

Secvențe în vectori

Definiție: Fie X[] un vector cu n element. Se numește secvență a


vectorului X o succesiune de elemente consecutive din X, în ordinea din X.

Orice secvență a unui vector este unic determinată de doi indici  st ≤ dr, ai
primului, respectiv ultimului element din secvență.

Exemplu: Fie vectorul X[]=(10,20,30,40,50,60,70,80). Atunci:

 (10,20,30,40), (30,40,50,60,70), (10,20,30,40,50,60,70,80), (50), (80) repr
ezintă secvențe ale lui X
 (10,30,40,20) nu reprezintă secvență în X – ordinea valorilor nu este cea
din X
 (10,20,40,50) nu reprezintă secvență în X – valorile nu sunt consecutive
în X
 (10,20,30,35,40) nu reprezintă secvență în X – avem o valoare care nu
apare în X

Definiție: Prin lungimea unei secvențe se înțelege numărul de elemente care


formează secvența. Lungimea secvenței delimitate de indicii  st și dr este dr
- st + 1.

Obs. Deci prin secvenţă a unui şir dat se înţelege o succesiune de unul
sau mai mulţi termeni din şir aflaţi pe poziţii consecutive.
De exemplu, pentru şirul (2,5,6,8,12,14,23,31), o secvenţă a acestuia este subşirul
(8,12,14,23). Precizez că şirul dat este o secvenţă a lui însuşi.
Deci dacă şirul dat este o secvenţă, atunci orice subşir al acestuia care are
termenii situaţi pe poziţii consecutive se numeşte subsecvenţă.

Secvență de lungime maximă


O problemă care apare frecvent este următoarea:

Fie X[] un vector cu elemente de un anumit tip. S ă se determine cea


mai lungă secvență din vector în care toate elementele au o anumit ă
proprietate (sunt pare, impare, prime, nule, ordonate cresc ător, egale
etc.).
Problema are mai multe soluții, cu complexități diverse. În toate solu țiile
vom determina st și dr – indicele elementului din stânga, respectiv din dreapta
al secvenței de lungime maximă. Inițial st = 1 și dr = 0, astfel încât lungimea
secvenței delimitate de st și dr să fie dr-st+1 = 0.

1
Secvență crescătoare
Dată o secvență cu n numere naturale, să se spună dacă cele n numere din secvență sunt în ordine
crescătoare (fiecare număr este mai mic sau egal cu cel de după el). Numerele naturale sunt mai mici sau
egale cu 2000000000.
crescatoare.in crescatoare.out Explicație
5 DA Secvenţa citită este o secvenţă crescătoare .
2 5 7 9 10
9 NU Secvenţa citită nu este o secvenţă crescătoare.
3 7 9 23 5 8 31 123 55

Rezolvare:

#include <fstream>
using namespace std;
ifstream fin("crescatoare.in");
ofstream fout("crescatoare.out");
int n,i,a,b,cresc;
int main() {
fin>>n;
fin>>a;
cresc = 1;
i = 1;
while ( i < n && cresc == 1)
{
fin>>b;
if ( b < a ) cresc = 0;
else
{ a = b; i++; }
}
if ( cresc == 1 )
fout<<"DA";
else
fout<<"NU";
fin.close(); fout.close();
return 0;
}

Scvenţă platou
Se dă o secvență de n numere naturale. Să se găsească subsecvenţa de lungime maximă ce are toate
numerele egale. Numerele naturale sunt mai mici sau egale cu 2000000000.
Exemple:

platou.in platou.out Explicație


14 5 Secvenţa cu cele mai multe numere egale este 4 4 4 4 4
34444477566999 şi are 5 numere.

Rezolvare:

2
pas1. Se citeşte n, numărul de numere. Citim primul număr în variabila a şi iniţializăm lungimea
secvenţei curente (secvenţa ce începe cu numărul citit în variabila a) cu 1 şi lungimea secvenţei maxime
cu 1 (lc=1,lmax=1).
pas2. Cât timp mai există numere necitite (i<n), citim un nou număr în variabila b. Comparăm a cu b.
Avem două situaţii:
• a=b, caz în care creşte lungimea secvenţei curente (lc=lc+1) şi o comparăm cu lmax, iar dacă
lc>lmax, actualizăm lmax cu lc (lmax=lc).
• a!=b, în acest caz iniţializăm a cu b (a=b) si lc cu 1 (lc=1).
pas3. În ambele situaţii incrementăm variabila i cu 1 (i=i+1) şi reluăm pas1.
După ce au fost citite toate numerele, se afişează lungimea secvenţei maxime.
#include <fstream>
using namespace std;
ifstream fin("platou.in");
ofstream fout("platou.out");
int n,i,a,b,lc,lmax;
int main() {
fin>>n; fin>>a; lmax = 1; lc = 1;
for ( i = 1; i < n; i++ )
{
fin>>b;
if ( b == a )
{
lc++;
if ( lc > lmax ) lmax = lc;
}
else
{ a = b; lc = 1;}
}
fout<<lmax;
fin.close(); fout.close();
return 0;
}

Subsecvență crescătoare
Se dă o secvența de n numere. Să se găsească subsecvenţa de lungime maximă ce are toate numerele
ordonate crescător. Dacă există mai multe astfel de secvente, se vor afişa toate. Din fişierul de intrare
cresc.in se va citi de pe prima linie un număr natural n, reprezentând numărul de numere al sevenţei date,
iar de pe rândul următor se vor citi n numere naturale, separate printr-un spaţiu. În fişierul de ieşire
cresc.out, se va afişa pe o linie lungimea secvenţei maxime, iar pe celelale linii, secvenţele de lungime
maximă, câte una, pe linie.
cresc.in cresc.out Explicaţie
15 5 Există două secvenţe cu lungime maximă 4 6 7 9 12 si 1 2 3 5 9
8 4 6 7 9 12 7 23 5 6 1 2 3 5 9 4 6 7 9 12
12359

3
Rezolvare:
O secvenţă crescătoare poate începe din oricare poziţie (i=1,…,n). Notăm cu lc, lungimea secvenţei
curente, iar cu lmax, lungimea celei mai mari secvenţe crescătoare. Comparăm elementele din poziţii
consecutive două câte două, şi de câte ori găsim o pereche de elemente consecutive (v[i],v[i+1]) egale,
creştem lungimea secvenţei curente cu 1(lc=lc+1). Când vom găsi două elemente situate pe poziţii
consecutive diferite, vom compara lungimea secvenţei curente, lc, cu lungimea secvenţei maxime, lmax.
În cazul în care lc>lmax, actualizăm lmax cu lc(lmax=lc). Iniţializăm lc cu 1(lc=1) şi căutăm o nouă
secvenţă începând cu elementul care a schimbat ordinea crescătoare a şirului.
Facem observaţia că şi din poziţia n poate începe o secvenţă, chiar dacă ştim că are lungimea 1; pentru a
nu restrânge generalitea algoritmului, imediat după citire vom adăuga şirului în mod artificial un element
care să aibă valoarea precedentului, mai puţin o unitate (v[n+1]=v[n]-1). Aceasta pentru a schimba
ordinea elementelor din secvenţă ce începe cu ultimul element. Pentru a afişa toate secventeţe, se
parcurge din nou şirul, şi în momentul în care s-a găsit o secvenţă de lungime maximă, aceasta se
afişează. Indicele de sfârşit al secvenţei este acel i pentru care v[i]!=v[i+1], iar indicele de început al
secvenţei de lungime maximă este i-lc+1.
#include <fstream>
using namespace std;
ifstream fin("cresc.in");
ofstream fout("cresc.out");
int n,i,j,v[101],lc,lmax;
int main() {
fin>>n;
for(i=1; i<=n; i++)
fin>>v[i];
v[n+1]=v[n]-1;//am adăugat un element
//determin secvenţa de lungime maximă
lc=1; lmax=1;
for(i=1; i<=n; i++){
if(v[i]<=v[i+1]) lc++;
else
{
if(lc>lmax) lmax=lc;
lc=1;
}
}
fout<<lmax<<'\n';
//afişez toate secvenţele de lungime maximă
lc=1;
for(i=1; i<=n; i++){
if(v[i]<=v[i+1]) lc++;
else
{
if(lc==lmax){
for(j=i-lc+1;j<=i;j++)
fout<<v[j]<<' ';
fout<<endl;
}
lc=1;
}
}
return 0;
4
}

Tema

http://liis.ro/~infosuport/6/fisa_vectori.pdf
http://varena.ro secvenţa bitonă, monotonă, subsecvenţa crescătoare, gondola
http://campion.edu.ro problemele: cub3, munte3, arc
http://www.pbinfo.ro/ problemele: SecvZero, SecvEgale, kSecventa, Subsecv

S-ar putea să vă placă și