Pagini recente » Cod sursa (job #2173628) | Cod sursa (job #2605639) | Cod sursa (job #501015) | Cod sursa (job #1807457) | Cod sursa (job #2181964)
// 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;
}