Cod sursa(job #523243)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 17 ianuarie 2011 15:37:44
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<stdio.h>

long n, maxlg, nrmaxlg, indicemaxlg, max, lg[1001], u[1001], nr[1001], a[1001], nrr;

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	
		scanf("%ld", &n);
		
		for (long i = 1; i <= n; i ++)
			scanf("%ld", &a[i]);
	
		for (long j = n; j >= 1; j --)
		{
			maxlg = 0;
			nrmaxlg = 0;
			indicemaxlg = 0;
			for (long i = j + 1; i <= n;  i ++)
				if (maxlg < lg[i] && a[i] > a[j])
				{
					maxlg = lg[i];
					nrmaxlg = nr[i];
					indicemaxlg = i;
				}
				else if (maxlg == lg[i] && a[i] > a[j]) nrmaxlg += nr[i];
			lg[j] = maxlg+1;
			u[j] = indicemaxlg;
			if(nrmaxlg == 0) nr[j] = 1; else nr[j] = nrmaxlg;
		}
		max = 0, nrr = 0;
		for (long i = 1; i <= n; i ++)
			if (max < lg[i]) {max = lg[i], nrr = i;}
			
		printf("%ld\n", max);
		
		while (nrr != 0)
		{
			printf("%ld ", a[nrr]);
			nrr = u[nrr];
		}
	
	return 0;
}