Pagini recente » Cod sursa (job #1916131) | Cod sursa (job #1093874) | Cod sursa (job #141275) | Cod sursa (job #2736246) | Cod sursa (job #1254868)
#include <cstdio>
int a[100001],t[100001],l[100001];
/**
t[i] = vectorul de tatzi. <=> t[i] = indicele elemenului care il precede pe a[i]
in subshirul maximal care se termina in a[i].
Daca a[i] incepe un nou subshir, t[i]=0.
l[i] = lungimea maxima a subshirului din care face parte a[i].
DAca a[i] incepe un subshir nou, atunci l[i]=0.
Daca nu, l[i]=l[t[i]]+1.
*/
int main()
{
int n,i,jmax,j,lmax,lsmax=0,imax;
FILE *f=fopen("scmax.in","r");
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&a[i]);
//verif. dintre TOATE alea de dinainte, dupa care poate fi pus a[i].
//shi-l aleg pe-ala care are l[i] maxim:
lmax=jmax=0;
for(j=1;j<i;j++)
if(a[i]>a[j] && l[j]>lmax)
lmax=l[jmax=j];
t[i]=jmax;
l[i]=lmax+1;
if(l[i]>lsmax)
lsmax=l[imax=i];
}
f=fopen("scmax.out","w");
fprintf(f,"%d\n",lsmax);
j=lsmax;
for(i=imax;i;i=t[i])
l[j--]=a[i];
for(i=1;i<=lsmax;i++)
fprintf(f,"%d ",l[i]);
fprintf(f,"\n");
return 0;
}