Cod sursa(job #1088647)

Utilizator alex03mihaimihai alexandru alex03mihai Data 20 ianuarie 2014 18:14:34
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#define NMAX 10000

using namespace std;

FILE * fin = fopen("scmax.in", "r");
FILE * fout = fopen("scmax.out", "w");

void citire();
void pd();
void constr_sol();
void afisare();

int n, a[NMAX];
int lg[NMAX];
int prec[NMAX];
int lgmax, sir[NMAX];
int main()
{
	citire();
	pd();
	constr_sol();
	afisare();
	return 0;
}

void citire()
{
	int i;
	fscanf(fin, "%d", &n);
	for (i = 1; i <= n; i ++)
		fscanf(fin, "%d", &a[i]);
}

void pd()
{
	int i, j;
	lg[1] = 1;
	prec[1] = 0;
	for (i = 2; i <= n; i ++)
	{
		lg[i] = 1; prec[i] = 0;
		for (j = 1; j < i; j ++)
			if (a[j] < a[i] && lg[j] + 1 > lg[i])
			{
				lg[i] = 1 + lg[j];
				prec[i] = j;
			}
	}
}

void constr_sol()
{
	int i, crt, pozmax;
	lgmax = 0;
	for (i = 1; i <= n; i ++)
		if (lgmax < lg[i])
		{
			lgmax = lg[i]; pozmax = i;
		}
	i = pozmax;
	crt = 0;
	while (i)
	{
		sir[++crt] = a[i];
		i = prec[i];
	}
}

void afisare()
{
	int i;
	fprintf(fout, "%d\n", lgmax);
	for (i = lgmax; i > 0; i --)
		fprintf(fout, "%d ", sir[i]);
	fprintf(fout, "\n");
}