Pagini recente » Cod sursa (job #495171) | Cod sursa (job #223159) | Cod sursa (job #3257126) | Cod sursa (job #1091100) | Cod sursa (job #630823)
Cod sursa(job #630823)
#include <stdio.h>
//#include <conio.h>
#include <stdlib.h>
void citire( int **sir, int *n){
int *vector, i;
FILE *f = fopen( "scmax.in", "rt");
if( !f){
printf( "\nFisierul nu poate fi deschis!!!");
exit( 0);
}
i = fscanf( f, "%i", n);
vector = (int*)calloc(*n,sizeof(int));
if(!vector)
return;
if( i != 0)
for( i = 0; i < *n; i++)
fscanf( f, "%i", &vector[ i]);
fclose( f);
*sir = vector;
return;
}
void scriere( int *sir, int n){
int i;
printf( "\nNumerele sunt:\n");
for( i = 0; i < n; i++)
printf( " %i", sir[ i]);
return;
}
int cmlung_subsir( int *sir, int n){
int i, j, cmlung = 0, pozitie = 0, k = 0, cm_precedent, poz_cm_prec, curent, max_vector;
int *vector;
int *final;
vector = (int *)calloc( n, sizeof( int));
if(!vector)
return -1;
final = (int *)calloc( n, sizeof( int));
if(!final)
return -1;
printf( "\n");
vector[ 0] = 1;
for( i = 1; i < n; i++){
//( in exact ordinea inversa)aici stabilesc maximul din vector si corespunzator lui sa fie in sir numarul mai mic decat numarul curent din sir
max_vector = 0;
for( k = 1; k <= i; k++)
if( sir[ i] > sir[ i - k]){
if( max_vector < vector[ i - k]){
max_vector = vector[ i - k];
}
}
vector[ i] = max_vector + 1;
}
//for( k = 0; k < n; k++)
// printf( " {%i", vector[ k]);
// getch();
cmlung = vector[ n - 1];
pozitie = n - 2;
for( i = n - 2; i >= 0; i--)
if( cmlung < vector[ i]){
pozitie = i;
cmlung = vector[ i];
}
//printf( "{%i}\n", pozitie);
i = pozitie;
int po = 0;
final[ po++] = sir[ i];
while( i >= 0){
for( j = 1; j <= i; j++)
if( vector[ i] == vector[ i - j] + 1){
final[ po++] = sir[ i - j];
break;
}
i = i - j;
}
FILE *kf = fopen( "scmax.out", "wt");
fprintf( kf, "%i\n", po);
for( i = po - 1; i >= 0; i--)
fprintf( k, "%i ", final[ i]);
fclose( kf);
return 1;
}
int main(){
int i, *sir_initial, n, k = 0;
citire( &sir_initial, &n);
//scriere( sir_initial, n);
cmlung_subsir( sir_initial, n);
return 0;
}