Pagini recente » Cod sursa (job #2661692) | Cod sursa (job #3158022) | Cod sursa (job #2883468) | Cod sursa (job #874402) | Cod sursa (job #541580)
Cod sursa(job #541580)
#include<fstream.h>
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[1000],l[1000],n,i,lm,p;
void citire()
{
fin>>n;
for(i=1;i<=n;i++)
fin>>a[i];
}
void subsir()
{
int i,j,max;
l[n]=1; // subsirul format din ultimul element are lungimea 1;
for(i=n-1;i>=1;i--) // parcurgem sirul a invers
{
max=0; // max este 0 pt fiecare subsir
for(j=i+1;j<=n;j++) // parcurgem a de la pozitia i+1 pana la n
if(l[j]>max && a[i]<=a[j]) // verificam daca lungimea sirului ce incepe cu a[j] este mai mare decat max, si daca elementul de pe pozitia i este mai mic decat a[j], pt a fi crescator
max=l[j]; // max devine l[j];
l[i]=max+1; // lungimea subsirului ce incepe cu elementul de pe pozitia i este cu 1 mai mare decat lungimea maxima a subsirului crescator ce incepe cu a[j]
if(lm<l[i]) // verificam daca lungimea maxima este mai mica decat lungimea subsirului crescator ce incepe cu a[i]
lm=l[i]; // daca este, atunci lungimea maxima devine lungimea subsirului crescator ce incepe cu a[i];
}
}
void drum()
{
int t;
t=0;// parcurgem l,l reprezinta lungimea subsirului ce incepe de la pozitia t=0,t<p
p=1; // parcurgem l, --''--
do
{
while(l[p]!=lm || a[t]>a[p]) // cat timp lungimea sirului ce incepe cu elementul a[p] este diferita de lungimea maxima sau daca elementul de pe pozitia t este mai mare decat cel de pe pozitia p
p++; // incrementam p, adica subsirul curent incepe de la pozitia p+1;
fout<<a[p]<<' '; // afisam a[p];
t=p; // ii dam lui t=p, pentru a incepe subsirul a[t] de la pozitia anterioara subsirului ce incepe cu a[p]
lm--; // micsoram lungimea maxima pentru a nu intra in bucla
}while(lm>0);
}
void afisare()
{
fout<<lm<<'\n'; // afisam lungimea maxima
}
int main()
{
citire();
subsir();
afisare();
drum();
return 0;
}
/* !!!LEGENDA!!!
a[1000]=vectorul pe care il citim, cu elementele citite
n=nr de elemente pe care le are a;
i,j= indicatori de parcurgere; in subsir(), avem 2 for-uri. cel de la i=n-1, la 1, in care il parcurgem pe a de la penultimul element, si cel de la j=i+1, la n, in care il parcurgem pe a de la pozitia i+1 la sfarsit, pentru a calcula cel mai lung subsir
t=variabila folosita la aflarea drumului, a[t] fiind subsirul incepand cu elementul t, t<p;
p=variabila folosita la aflarea drumului, a[p] fiind subsirul ce incepe cu elementul p, p=t+1;
lm= lungimea subsirului maximal*/