Mai intai trebuie sa te autentifici.
Cod sursa(job #705165)
Utilizator | 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;
}