Cod sursa(job #630829)

Utilizator dcarbunescucarbunescu dcarbunescu Data 6 noiembrie 2011 17:09:09
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#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 - 1;
    for( i = n - 2; i >= 0; i--)
        if( cmlung < vector[ i]){
            pozitie = i;
            cmlung = vector[ i];
        }

    //printf( "{%i}\n", cmlung);
    //printf( "{%i}\n", pozitie);

    i = pozitie;
    int po = 0;

    final[ po++] = sir[ i];
    //printf( "%i", 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");
    //printf( "po:%i", po);
    fprintf( kf, "%i\n", po);

    for( i = po - 1; i >= 0; i--)
            fprintf( kf, "%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;
}