Cod sursa(job #1701686)

Utilizator GilgodRobert B Gilgod Data 13 mai 2016 20:56:17
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>

using namespace std;

#define NMAX	100000
#define IN		"scmax.in"
#define OUT		"scmax.out"
#define NO_PI	-1
#define max(a,b) ((a) > (b)) ? (a) : (b)

int A[NMAX], PI[NMAX], BEST[NMAX];
int N;
int best, best_tail;

inline void read_data()
{
	freopen(IN, "r", stdin);

	scanf("%d", &N);
	printf("%d\n", N);
	for (int i = 0; i < N; ++i)
		scanf("%d", &A[i]);

	fclose(stdin);
}

inline void reconstruct(int i)
{
	if (i == NO_PI)
		return;
	reconstruct(PI[i]);
	printf("%d ", A[i]);
}

inline void comp()
{
	PI[0] = NO_PI;
	BEST[0] = 1;
	best = 1;
	best_tail = 1;

	for (int i = 1; i < N; ++i) {
		PI[i] = NO_PI, BEST[i] = 1;
		for (int j = i - 1; j >= 0; --j) {
			if (A[j] >= A[i])
				continue;
			if (BEST[j] + 1 > BEST[i]) {
				BEST[i] = BEST[j] + 1;
				PI[i] = j;
			}
		}
		if (BEST[i] > best) {
			best = BEST[i];
			best_tail = i;
		}
	}
}

int main()
{
	read_data();
	comp();
	freopen(OUT, "w", stdout);
	printf("%d\n", best);
	reconstruct(best_tail);
	printf("\n");
	fclose(stdout);
	return 0;
}