Cod sursa(job #541580)

Utilizator PsychoRoAlex Buicescu PsychoRo Data 25 februarie 2011 12:18:38
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.37 kb
#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*/