Cod sursa(job #266444)

Utilizator scvalexAlexandru Scvortov scvalex Data 25 februarie 2009 16:24:02
Problema Subsir crescator maximal Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>

int N;
int A[100000];
int L[100000];
int P[100000];
int M[100000];

inline int max(int a, int b) {
	return ((a > b) ? (a) : (b));
}

int main(int argc, char *argv[]) {
	int i, j, ML;

	FILE *fi = fopen("scmax.in", "r");
	fscanf(fi, "%d", &N);
	for (i = 0; i < N; ++i)
		fscanf(fi, "%d", A+i);
	fclose(fi);

	L[0] = 1;
	M[0] = 1;
	for (i = 1; i < N; ++i) {
		for (j = i-1; j >= 0; --j) {
			if (L[i] > M[j])
				break;
			if ((A[i] > A[j]) && (!L[i] || (L[j]+1 > L[i]))) {
				P[i] = j;
				L[i] = L[j] + 1;
			}
		}
		if (!L[i]) {
			L[i] = 1;
			P[i] = i;
		}
		M[i] = max(M[i-1], L[i]);
	}

	/*for (i = 0; i < N; ++i)
		printf("%d ", A[i]);
	printf("\n");
	for (i = 0; i < N; ++i)
		printf("%d ", L[i]);
	printf("\n");
	for (i = 0; i < N; ++i)
		printf("%d ", P[i]);
	printf("\n");*/

	ML = M[N-1];
	j = ML-1;
	for (i = N-1; L[i] != ML; --i)
		;
	for (; i != P[i]; i = P[i], --j)
		M[j] = A[i];
	M[0] = A[i];

	FILE *fo = fopen("scmax.out", "w");
	fprintf(fo, "%d\n", M[N-1]);
	for (i = 0; i < ML; ++i)
		fprintf(fo, "%d ", M[i]);
	fprintf(fo, "\n");
	fclose(fo);

	return 0;
}