Cod sursa(job #256853)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 12 februarie 2009 12:21:11
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.59 kb
#include<stdio.h>
#define infile "scmax.in"
#define outfile "scmax.out"
#define nmax (100*1000+1)
int v[nmax]; //vectorul cu sirul
int a[nmax]; //a[i]-pozitia elementului din v[], ce are o lungime a subsirului ce se termina in v[a[i]] egala cu i.
int b[nmax]; //pozitia elementului precedent in subsir crecator de lungime maxima
int l; //lungimea maxima gasita
int n; //lungimea sirului

int maxim(int a, int b)
	{
	if(a<b) return a;
	return b;
	}

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

//rezolvarea dinamica
void dinamica()
	{
	int i,j,k;
	a[l=1]=1; //ungimea maxima este 1, si ultimul element este defapt primul element din sir
	for(i=2;i<=n;i++) //trecem pe la fiecare element
		{
		for(j=l;j>=0;j--) //cautam inapoi in vector lungimea cea mai mare
			if(v[a[j]]<v[i]) //am gasit un element de lungime maxima mai mic decat v[i]
				{
				 //salvam la lungime daca avem un element mai mic
				if(!a[j+1]) a[j+1]=i,l++;
				else if(v[a[j+1]]>v[i]) a[j+1]=i;
				
				b[i]=a[j]; //ii salvam tatal
				break; //oprim cautarea
				}
		}
	}

//pozitia ce trebuie afisata
void afisare(int p)
	{
	if(b[p]) afisare(b[p]); //ii afisez intai tatal
	printf("%d ",v[p]); //il afisez pe el
	}

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

citire(v,&n); //citim sirul
dinamica(); //facem dinamica

printf("%d\n",l); //afisem lungimea
afisare(a[l]); //afisem susirul incepand de la elementul de lungime maxima (pt k il afisem in psotordine)

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