Cod sursa(job #759808)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 19 iunie 2012 14:33:44
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>
#include <stdlib.h>

void print_rev(int *v, int *pred, int i, FILE *g) {
	if (pred[i] == i) {
		fprintf(g, "%d ", v[i]);
		return;
	}
	print_rev(v, pred, pred[i], g);
	fprintf(g, "%d ", v[i]);
	return;
}

int main() {
	FILE *f = fopen("scmax.in", "r");
	FILE *g = fopen("scmax.out", "w");

	int n;
	int *v;
	int *max, *pred;
	fscanf(f, "%d", &n);
	
	v = (int *) malloc(sizeof(int) * n);
	max = (int *) malloc(sizeof(int) * n);
	pred = (int *) malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++) {
		fscanf(f, "%d", &v[i]);
	}

	max[0] = 1;
	for (int i = 0; i < n; i++) {
		int best = 1, cur = i;
		for (int j = 0; j < i; j++) {
			if (v[j] < v[i] && max[j] + 1 > best) {
				cur = j;
				best = max[j] + 1;
			}
		}
		pred[i] = cur;
		max[i] = best;
	}

	int best = max[0];
	int stop;
	for (int i = 1; i < n; i++) {
		if (best < max[i]) {
			best = max[i];
			stop = i;
		}
	}
	fprintf(g, "%d\n", best);
	print_rev(v, pred, stop, g);

	fclose(f);
	fclose(g);
}