Cod sursa(job #552892)

Utilizator c_adelinaCristescu Adelina c_adelina Data 13 martie 2011 09:27:42
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include  <cstdio>
#define N 100003

inline int max(int a, int b) { return (a > b ? a : b); }
inline int ab(int a) { return (a >=0 ? a : -a); }

int v[N],l[N],d[N],bf[N];
int main()
{
	int n,i,j,lmx=1,dif=0,poz;
	
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;++i)
		{
			scanf("%d",&v[i]);
			l[i]=1;
			for (j=1;j<i;++j)
 				if ((v[j]<v[i]) && (l[j]+1>=l[i]))
				{
					if (l[j]+1>l[i])
						l[i]=l[j]+1,d[i]=max(d[j],ab(v[i]-v[j])),bf[i]=j; else
							if ((l[j]+1==l[i]) && (d[i]>max(d[j],ab(v[i]-v[j]))))
								d[i]=max(d[j],ab(v[i]-v[j])),bf[i]=j;
				}
			if (l[i]>lmx) 
				lmx=l[i],dif=d[i],poz=i; else
					if ((l[i]==lmx) && (dif>d[i])) dif=d[i],poz=i;
		}
	printf("%d\n",lmx);
	for (i=lmx;i;--i)
		l[i]=poz,poz=bf[poz];
	for (i=1;i<=lmx;++i) printf("%d ",v[l[i]]);
	
return 0;
}