Cod sursa(job #705165)

Utilizator asaidaAnca Vamanu asaida Data 3 martie 2012 15:30:06
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*  Relatia de recurenta:
 *  best[i] = 1 + max(best[j]), 1 <= j< i si aj < ai
 *  pre[i]  = j
 * */


#define NMAX 100002
int N;
int v[NMAX];
int best[NMAX];
int pre[NMAX];
int bmax = 0, bi;

void solutie_scmax()
{
	int i, j;
	int max, mj;

	memset(best, 1, N*sizeof(int));

	for(i = 2; i <= N; i++) {
		max = 0;
		for(j = 1; j < i; j++ ) {
			if ( v[j] < v[i]  && max < best[j] ) {
				max = best[j];
				mj = j;
			}
		}
		best[i] = 1 + max;
		pre[j] = mj;
		if(bmax < best[i]) {
			bmax = best[i];
			bi = i;
		}
	}
}

void print_sol(FILE* fout, int pos)
{
	if (best[pos] == 1) {
		fprintf(fout, "%d", v[pos]);
		return;
	}

	print_sol(fout, pre[pos]);

	fprintf(fout, " %d", v[pos]);
}

int main()
{
	FILE *f, *fout;
	int i;

	f = fopen("scmax.in", "r");

	fscanf(f, "%d", &N);
	for(i  = 1 ; i <= N; i++ ) {
		fscanf(f, "%d", &v[i]);
	}
	fclose(f);

	solutie_scmax();

	fout = fopen("scmax.out", "w");
	fprintf(fout, "%d\n", bmax);
	print_sol(fout, bi);
	fprintf(fout, "\n");

	fclose(fout);
	return 0;
}