Cod sursa(job #1456921)

Utilizator StefanRARapeanu-Andreescu Stefan StefanRA Data 2 iulie 2015 13:44:34
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include <cstdio>
#include <cstdlib>
#include <cassert>
int n, *v, *l, *next, lmax, start;
int main()
{
	assert(freopen("drum6.in", "r", stdin));
	assert(freopen("drum6.out", "w", stdout));
	assert(scanf("%d", &n));
	v=(int *)malloc((n+1)*sizeof(int));
	l=(int *)malloc((n+1)*sizeof(int));
	next=(int *)calloc(n+1, sizeof(int));
	for (int i=0;i<n;++i)
		assert(scanf("%d", &v[i]));
	for (int i=n;i>0;--i)
	{
		l[i]=1;
		for (int j=i+1;j<=n;++j)
			if (v[i]<v[j] && l[i]<1+l[j])
			{
				l[i]=l[j]+1;
				next[i]=j;
			}
		if (lmax<l[i])
		{
			lmax=l[i];
			start=i;
		}
	}
	printf("%d\n", lmax);
	for (int i=start;i!=0;i=next[i])
		printf("%d ", v[i]);
	free(v);
	free(l);
	free(next);
	return 0;
}