Cod sursa(job #413279)

Utilizator Mihai_OrtelecanOrtelecan Mihai Alexandru Mihai_Ortelecan Data 8 martie 2010 01:22:05
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>
#include <stdlib.h>

int main() {

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

	long int n, i, j, sub_count = 0, IND = 0, k = 0;
	long int *nr, *B, *S;

	fscanf(fin, "%ld", &n);

	nr = (long int*) malloc(n * sizeof(long int));
	B = (long int*) malloc(n * sizeof(long int));
	S = (long int*) malloc(n * sizeof(long int));

	for (i = 0; i < n; i++) {
		fscanf(fin, "%ld", &nr[i]);
	}

	for (i = 0; i < n; i++) {

		B[i] = 1;
		S[i] = -1;

		if (nr[i] > IND) {
			IND = i;
		}
		for (j = i - 1; j >= 0; j--) {

			if (nr[j] < nr[i] && B[j] >= B[i]) {

				B[i] = B[j] + 1;
				S[i] = j;
			}
		}
		if (B[i] > sub_count) {
			sub_count = B[i];
		}
	}

	fprintf(fout, "%ld\n", sub_count);

	long int* sol = (long int*) malloc(sub_count * sizeof(long int));
	i = IND;

	while (i != -1) {
		sol[k] = nr[i];
		k++;
		i = S[i];
	}
	for (i = k - 1; i >= 0; i--) {
		printf("%ld ", sol[i]);
		fprintf(fout, "%ld ", sol[i]);
	}
	return 0;
}