Cod sursa(job #789498)

Utilizator legendary28Cornescu Mihail legendary28 Data 18 septembrie 2012 15:39:43
Problema Cel mai lung subsir comun Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>

#define Nmax 1030
#define MAX(x,y) (x>y?x:y)

int A[Nmax],B[Nmax],D[Nmax][Nmax],S[Nmax],i,j,N,M,k,p,l;

int main()
{

    freopen("cmlsc.in","r",stdin);
    freopen("cmlsc.out","w",stdout);

    scanf("%d%d",&M,&N);
    for(i=1;i<=M;i++)
        scanf("%d",&A[i]);
    for(i=1;i<=N;i++)
        scanf("%d",&B[i]);

    for(i=1;i<=M;i++)
        for(j=1;j<=N;j++)
            if(A[i]==B[j])
                D[i][j]=D[i-1][j-1]+1;
            else D[i][j]=MAX(D[i-1][j],D[i][j-1]);

    printf("%d\n",M);
    printf("%d\n",N);

    for(i=1;i<=M;i++)
    {
        for(j=1;j<=N;j++)
            printf("%d ",D[i][j]);
        printf("\n");
    }

    l=0;
    i=M;j=N;
    k=D[i][j];
    while(k)
    {
        printf("\n%d\n",D[i][j]);
        if(D[i][j]>D[i-1][j-1])
        {
            S[++l]=A[i--];
            j++;
        }

        else if(D[i-1][j]>=D[i][j-1])
                k=D[--i][j];
            else
                k=D[i][--j];
    }

    printf("%d\n",l);
    for(;l;--l)
        printf("%d ",S[l]);

    return 0;
}