Sunteți pe pagina 1din 1

Cerință :

Se citesc de la tastatura 2 șiruri x si y cu n, respectiv m elemente numere întregi. Se


cere sa se determine cel mai lung subșir comun celor 2 șiruri.
Exemplu :
m=8 n=9
x : 10 4 20 10 40 2 0 60
y : 4 90 7 10 70 2 71 81 0
Cel mai lung subșir comun : 4 10 2 0.
Soluție
#include<iostream>
#define N 101
using namespace std;
int a[N][N],x[N],y[N],m,n,v[N],k;
void citire()
{
int i;
cin>>m>>n;
for(i=1; i<=m; i++) cin>>x[i];
for(i=1; i<=n; i++) cin>>y[i];
}
void dinamica()
{
int i,j;
for(i=0; i<=m; i++) a[i][0]=0;
for(j=0; j<=n; j++) a[0][j]=0;
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
if(x[i]==y[j])
a[i][j]=a[i-1][j-1]+1;
else
a[i][j]=max(a[i-1][j],a[i][j-1]);
cout<<a[m][n]<<"\n";
}

void afisare(int i,int j)


{
k=0;
while(i>0&&j>0)
{
if(x[i]==y[j]){v[++k]=x[i];i--;j--;}
else if(a[i][j]==a[i-1][j]) i--;
else if(a[i][j]==a[i][j-1]) j--;
}
for(i=k; i>=1; i--) cout<<v[i]<<" ";
}
int main()
{
citire();
dinamica();
afisare(m,n);
return 0;
}

S-ar putea să vă placă și