Cod sursa(job #2181964)

Utilizator valentinpielePiele Valentin valentinpiele Data 21 martie 2018 23:06:56
Problema Subsir crescator maximal Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.84 kb
// Fie un vector cu N elemente. Numim subsir al lui 'a' de lungime 'k' un vector
// 'b', (b = (ai1, ai2,..,aik)) astfel incat i1 < i2 <.. ik.
// Sa se determine un subsir al lui 'a' care este ordonat crescator si care are 
// lungimea maxima.


#include <stdio.h>

#define NMax 100005

void read(int *n, int v[]) {
	FILE *f;
	f = fopen("scmax.in", "r");
	
	fscanf(f, "%d", n);
	
	int i;
	for(i = 0; i < (*n); i ++) {
		fscanf(f, "%d", &v[i]);
	}

	fclose(f);	
}

void write(int sol, int n, int poz, int r[], int v[]) {
	FILE *f;
	f = fopen("scmax.out", "w");
	
	fprintf(f, "%d\n", sol);
	
	int q[sol];
	int sol_copy = sol;
	q[sol - 1] = poz;
	while(sol != 0) {
		sol --;
		q[sol - 1] = r[ q[sol] ];
	}

	int i;
	for(i = 0; i < sol_copy; i ++) {
		fprintf(f, "%d ", v[ q[i] ]);
	}
	fprintf(f, "\n");
	
	fclose(f);
}

int main() {
	int n; 			// numarul de elemente al vectorului
	int v[NMax];		// vectorul cu numerele in care caut subsirul
	int d[NMax] = {0};	// vectorul cu lungimea maxima a unui subsir la un mom dat
	int r[NMax];		// vectorul cu care tin minte pozitiile pe care sa le afisez
	int i, j;
	int sol;
	int poz; 		// pozitia pe care se termina subsirul cel mai lung

	read(&n, v);
	
	d[0] = 1;	// [ v[0] ] e singurul subsir care se termina pe pozitia 0
	r[0] = -1;	// incep un nou subsir

	for(i = 1; i < n; i ++) {
		d[i] = 1; 	// [ v[i] ] subsir crescator ce se termina pe pozitia i
		r[i] = -1;
		// incerc sa il pun pe v[i] la finalul tuturor solutiilor disponibile
		for(j = 0; j < i; j ++) {
			if(v[j] < v[i]) {
				// aleg j in cazul in care reprezinta o solutie mai buna
				if(d[j] + 1 > d[i]) {
					d[i] = d[j] + 1;
					r[i] = j;
				}
			}
		}
	}


	// aleg solutia cea mai buna
	sol = d[0];
	poz = 0;
	for(i = 1; i < n; i ++) {
		if(d[i] > sol) {
			sol = d[i];
			poz = i;
		}
	}

	// scrierea solutiei in fisier
	write(sol, n, poz, r, v);
	
	return 0;
}