Cod sursa(job #2233533)

Utilizator skoda888Alexandru Robert skoda888 Data 23 august 2018 16:15:50
Problema Cel mai lung subsir comun Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb

//Arhiva Educationala - 001. Cel mai lung subsir comun

#include <iostream>
#include <fstream>

int main()
{
    std::ifstream in("cmlsc.in");
    std::ofstream out("cmlsc.out");

    int M; //numarul de elemente ale vect. A
    in >> M;
    int N; //numarul de elemente ale vect. B
    in >> N;

    //citirea elementelor vect. A
    int A[M];
    for(int i = 0; i < M; ++i){
        in >> A[i];
    }

    //citirea elementelor vect. B
    int B[N];
    for(int i = 0; i < N; ++i){
        in >> B[i];
    }

    //Voi utiliza programarea dinamica, metoda tabulara
    int DP_table[M + 2][N + 2] = {};
    int lcs[std::max(M, N)];
    for(int i = 1; i <= M; ++i){
        for(int j = 1; j <= N; ++j){
            if(A[i - 1] == B[j - 1]){
                DP_table[i][j] = DP_table[i - 1][j - 1] + 1;
                lcs[DP_table[i][j]] = A[i - 1];
            }
            else{
                DP_table[i][j] = std::max(DP_table[i][j - 1], DP_table[i - 1][j]);
            }
        }
    }

    out << DP_table[M][N] << '\n';
    for(int i = 1; i <= DP_table[M][N]; ++i){
        out << lcs[i] << ' ';
    }
    return 0;
}