Skip navigation

Se dau n piese de domino.

Fiecare piesa poate fi rotita cu 180 de grade.

Sa se determine subsirul de piese de lungime maxima astfel incat oricare 2 piese alaturate in subsir sa aiba un numar in comun.

Exemplu:

v.first: 5 1 2 3 1 6 5 5 2 1 5 5 3

v.second: 6 1 5 2 5 4 1 3 1 4 5 2 3

Algoritm:

#include <fstream.h>
#include <iostream.h>
typedef struct { int first, sec; } PIESA;
PIESA v[100];
int n, d[2][100], poz[2][100];
void citire()
{
ifstream f(“domino.in”);
while(!f.eof())
f>>v[++n].first>>v[n].sec;
f.close();
}
void dinamica()
{
int i, j ,max0, max1, p0, p1;
d[0][n]=d[1][n]=1;
poz[0][n]=poz[1][n]=0;
for(i=n-1;  i>=1;  i–-)
{ max0=max1=0;
p0=p1=0;
for(j=i+1;  j<=n;  j++)
{ if(v[i].sec==v[j].first  &&  d[0][j]>max0)
{ max0=d[0][j];
p0=j;
}
if(v[i].sec==v[j].sec  &&  d[1][j]>max0)
{ max0=d[1][j];
p0=j;
}
if(v[i].first==v[j].sec  &&  d[1][j]>max1)
{ max1=d[1][j];
p1=j;
}
if(v[i].first==v[j].first  &&  d[0][j]>max1)
{ max1=d[0][j];
p1=j;
}
}
d[0][i]=max0+1;
d[1][i]=max1+1;
poz[0][i]=p0;
poz[1][i]=p1;
}
}
void afisare()
{
int i, k ,p, aux, max=0;
for(i=1;  i<=n;  i++)
{ if(d[0][i]>max) { max=d[0][i];  k=0;  p=i;}
if(d[1][i]>max) { max=d[1][i];  k=1;  p=i; }
}
cout<<max<<endl;
if(k==0) { cout<<v[p].first<<” “<<v[p].sec<<endl;  aux=v[p].sec;}
else { cout<<v[p].sec<<” “<<v[p].first<<endl;  aux=v[p].first;}
p=poz[k][p];
while(p>0)
{ if(aux==v[p].first)
{ cout<<v[p].first<<” “<<v[p].sec<<endl;  aux=v[p].sec;  k=0;}
else { cout<<v[p].sec<<” “<<v[p].first<<endl;  aux=v[p].first;  k=1;}
p=poz[k][p];
}
}
int main ()
{
citire();
dinamica();
afisare();
return 0;
}

 

Se dau x si y doua siruri cu m respectiv n numere.

Se cere sa se determine cel mai lung subsir comun celor doua siruri.

Exemplu:

m=8

10 4 20 10 40 2 0 60

n=9

4 90 7 10 70 2 71 81 0

Cel mai lung subsir comun este : 4 10 2 0

Program :

#include
int x[100], y[100], a[50][50], n, m;
void citire (int v[],i nt n)
{
int i;
cin>>n;
for(i=1; i>v[i];

}

int maxim (int x, int y)
{
if(x>y) return x;

else return y;

}

void dinamica()
{
int i, j;

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]=maxim(a[i-1][j], a[i][j-1]);
cout<<”Lungimea maxima este: ”<<a[m][n]<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 j–-;}
for(i=k; i>=1; i–)cout<<v[i]<<” “;
}
int main()
{
citire(x, m);
citire(y, n);
dinamica();
afisare(m, n);
return 0;
}

Locul 1. Am dat cam bine.

A lot of projects!

Follow

Get every new post delivered to your Inbox.