Cod sursa(job #767088)

Utilizator dmincuMincu Diana dmincu Data 12 iulie 2012 18:25:58
Problema Cel mai lung subsir comun Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.42 kb
#include <stdio.h>

#define MAXLEN 1024
#define DIAG 0
#define SUS 1
#define STANGA 2

void scrie_cmlsc(int dim_rs, 
                 int refacere_subsir[][dim_rs], 
                 int sir1[], 
                 int i, 
                 int j,
                 FILE *g){

    if ((i == 0) || (j == 0))
        return;

    if (refacere_subsir[i][j] == DIAG){
        scrie_cmlsc(dim_rs, refacere_subsir, sir1, i - 1, j - 1, g);
        fprintf(g, "%i ", sir1[i - 1]);
    }
    else{
        if (refacere_subsir[i][j] == SUS)
            scrie_cmlsc(dim_rs, refacere_subsir, sir1, i - 1, j, g);
        else
            scrie_cmlsc(dim_rs, refacere_subsir, sir1, i, j - 1, g);
    }
}

int main(){
    
    FILE *f, *g;
    int i, j;
    int dim_sir_1, dim_sir_2;

    f = fopen("cmlsc.in", "rt");
    if (!f)
        perror("Nu merge deschis fisierul de intrare.\n");
    g = fopen("cmlsc.out", "wt");
    if (!g)
        perror("Nu merge deschis fisierul de iesire.\n");

    /* Citim dimensiunile celor doua siruri. */
    fscanf(f, "%i %i", &dim_sir_1, &dim_sir_2);

    int sir1[dim_sir_1 + 1], sir2[dim_sir_2 + 1];
    int mat_pd[dim_sir_1 + 1][dim_sir_2 + 1];
    int refacere_subsir[dim_sir_1 + 1][dim_sir_2 + 1];

    /* Citim primul sir. */
    for (i = 0; i < dim_sir_1; i++)
        fscanf(f, "%i", &sir1[i]);

    /* Citim al doilea sir. */
    for (i = 0; i < dim_sir_2; i++)
        fscanf(f, "%i", &sir2[i]);

    /* Utilizand programare dinamica, aflam lungimea maxima. */
    for (i = 0; i <= dim_sir_1; i++)
        mat_pd[i][0] = 0;
    for (j = 0; j <= dim_sir_2; j++)
        mat_pd[0][j] = 0;
    for (i = 1; i <= dim_sir_1; i++)
        for (j = 1; j <= dim_sir_2; j++)
            if (sir1[i - 1] == sir2[j - 1]){
                mat_pd[i][j] = mat_pd[i - 1][j - 1] + 1;
                refacere_subsir[i][j] = DIAG;
            }
            else{
                if (mat_pd[i -1][j] >= mat_pd[i][j - 1]){
                    mat_pd[i][j] = mat_pd[i - 1][j];
                    refacere_subsir[i][j] = SUS;
                }
                else{
                    mat_pd[i][j] = mat_pd[i][j -1];
                    refacere_subsir[i][j] = STANGA;
                }
            }
    fprintf(g, "%i\n", mat_pd[dim_sir_1][dim_sir_2]);
    
    /* Construim subsirul de lungime maxima pe baza lui refacere_subsir. */
    scrie_cmlsc(dim_sir_2 + 1, refacere_subsir, sir1, dim_sir_1, dim_sir_2, g);

    fclose(g);
    fclose(f);

    return 0;
}