Cod sursa(job #256753)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 12 februarie 2009 08:38:58
Problema Subsir crescator maximal Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
#define infile "scmax.in"
#define outfile "scmax.out"
#define nmax (100*1000+1)
int v[nmax]; //vectorul cu subsirul
int a[nmax]; //vectorul axiliar
int b[nmax]; //vectorul care stie pozitia elementului anterior pt refacerea subsirului
int n; //lungimea sirului

void citire(int v[nmax], int *n)
	{
	int i;
	scanf("%d\n",n);
	for(i=1;i<=*n;i++)
		scanf("%d",&v[i]);
	}

//dinamica cu care aflam subsirul crescator maximal
void dinamica()
	{
	int i,j,k,p;
	for(i=2;i<=n;i++) //trecem pe la fiecare element in parte
		{
		for(p=k=0,j=1;j<i;j++) //cautam in toate elementele rezolvate, pe care acesta sa-l continue
			if(v[j]<v[i]&&a[j]>k) //daca am gasit un element mai mic, si daca are lungime mai mare
				k=a[j],p=j; //salvam lungimea, si pozitia
		a[i]=k+1,b[i]=p; //salvam lungimea maxima e se poate obtine pana in i, si caracterul ce il precede
		}
	}

//afiseaza recursiv subsirul (in postordine)
void afisare_subsir(int k)
	{
	if(b[k]) afisare_subsir(b[k]); //afisem intai elementul anterior
	printf("%d ",v[k]);
	}

void afisare()
	{
	int i,j=0,k=0;
	for(i=1;i<=n;i++)
		if(a[i]>k) k=a[i],j=i; //am gasit un sir de lungime mai mare
	printf("%d\n",k); //afisem lungimea sirului de lungime maxima
	afisare_subsir(j); //afisem si subsirul
	}

int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

citire(v,&n); //citim
dinamica(); //creeam cei doi vectori auxiliari
afisare(); //afisem

fclose(stdin);
fclose(stdout);
return 0;
}